1

ユーザーごとに1通のメールを送信するすべてのユーザーにメールを送信します。

関数は機能しますが、Webアプリに醜いエラーメッセージが表示されます。私が得るログで

2012-08-28T12:08:03+00:00 heroku[router]: Error H12 (Request timeout) -> POST afternoon-spring-6294.herokuapp.com/welcome/wall dyno=web.1 queue= wait= service=30000ms status=503 bytes=0
[...]
Sent mail to xxxx@xxxxx.xxxx (1708ms)
2012-08-28T12:08:31+00:00 app[web.1]: Redirected to http://afternoon-spring-6294.herokuapp.com/
2012-08-28T12:08:31+00:00 app[web.1]: Completed 302 Found in 58114ms (ActiveRecord: 8.9ms)

回避策はありますか(33通の電子メールによってトリガーされました)?

4

1 に答える 1

1

Herokuは、30秒より長く実行されるすべてのプロセスを取得します。つまり、mailgunやsendgridなどを介したほとんどすべてのバッチ電子メールがH12エラーで強制終了されます。

処理するための基本的な方法はいくつかありますが、すべてが物事をより非同期にすることを含みます。Herokuワーカープロセスは無期限に実行できます。少なくとも30秒より長く実行できます。

従来のオプションはキューを使用することです。delayed_jobは非常に単純で、データベースをバックアップするだけで済みます。Resqueもクールですが、Redisをミックスに追加する必要があります。より洗練されたオプションもたくさんありますが、delayed_jobは非常に単純です。Railscastsは、おそらくここでそれを行う方法を理解するためのあなたの友達です。

もう1つのオプションは、ワーカープロセスを使用して電子メールタスクを直接処理することです。たとえば、ワーカーを使用して、レーキタスクを使用してX分ごとにバッチで電子メールを送信できます。これは、すべてのオーバーヘッドのない一種のキューです。招待状のバッチを送信する必要があるとします。送信されていないステータスの招待状をテーブルに書き込み、レーキタスクで最初の招待状をポップして送信し、完了するまで繰り返します。基本的には単純なキューを再実装しますが、より快適に感じるかもしれません。

個人的には、もっと強力なものが必要になるまで、delayed_jobを入れていました。

于 2012-08-28T13:48:54.107 に答える