私は、バックグラウンド処理のためにActionMailer、SendGrid、およびDelayedJob/Resqueを使用してHeroku上にRails 4.2.5アプリを持っています。私はlocalhost上で再現できない奇妙な問題を抱えています。ActionMailer + DelayedJob + Resque + SendGrid =すべてのメールが送信されていません
私はバッチの電子メールを送信します。エラーは発生しないので、電子メールは正常に送信されたように見えます。私はその後、SendGridの活動タブをチェックし、そこにある電子メールの半分しか見ることができません。
私はSendGridやActionMailerで多くのことをしていないので、問題をデバッグする方法やローカルで再現する方法がわかりません。私は私のアプリで100 contacts
を作成して、それを同じ通知メッセージを送信することで再現しようとしましたが(まるでプロダクションのアプリで起こるように)、それらはすべて正常に実行されます。
development.rb
で
とproduction.rb
私が持っている:production.rb
で
config.action_mailer.raise_delivery_errors = true
は私が持っている:
config.action_mailer.default_url_options = { :host => 'http://firmplay.com' }
# config.action_mailer.delivery_method = :sendmail
# config.action_mailer.sendmail_settings = {
# :location => '/usr/sbin/sendmail',
# :arguments => '-i -t'
# }
# config.action_mailer.perform_deliveries = true
# config.action_mailer.raise_delivery_errors = true
私がコメントしたコードは、コメントを解除するかどうか分かりません。 environment.rb
で
私が持っている:application.rb
で
ActionMailer::Base.smtp_settings = {
:address => 'smtp.sendgrid.net',
:port => '587',
:authentication => :plain,
:user_name => ENV['SENDGRID_USERNAME'],
:password => ENV['SENDGRID_PASSWORD'],
:domain => 'heroku.com',
:enable_starttls_auto => true
}
は私が持っている:
config.active_job.queue_adapter = :resque
私は疑うけれども、私は、問題が始まったとき、私はここで間違ったりしてもやっているかわからないんだけど私の最近のRails 4.0から4.2.5へのアップグレードに関連しています。私は電子メールがDelayedJob/Resqueのどこかで失敗しているのか疑問に思ったので、私はResqueログをチェックし、普通のものを見つけ出しませんでした。
部分的な解決策で更新
でも、私は、問題に対処する上でいくつかの進歩を遂げることができました。私が製作をテストしていたとき、ウェブダイノーを使って電子メールをバックグラウンドジョブとしてキューイングすると、アプリケーションの制限である10秒後にタイムアウトしたことに気付きました。 Webワーカーがタイムアウトした後も、メモリ不足(ログ内のR14エラーがいくつか見られた)までメールのキューイングを続けました。
電子メールのキューイング時にメモリが不足している理由を特定できませんでした。私は電子メールを変数としてメモリに格納していませんでしたが、連絡先リストを繰り返したときに意図せず格納されている可能性があります。
私がやり遂げたのは、連絡先リストを渡すことができるバックグラウンドジョブを作成することでした。その後、バックグラウンドジョブは電子メールを直接送信します。私がこのアプローチをテストしたところ、すべてがうまくいっていて、かなりスケールアップしました。本質的には私の問題は解決されていますが、Resqueを実行しているバックグラウンドワーカーはこのような問題を抱えていませんでしたが、電子メールのキューイング時にWeb dynoにメモリが不足している理由を調べたいと思っています。
私は当初、連絡先を通じて.map
を使用して繰り返していました。これはメモリ内の各ループ内に返された最後の項目を格納します。私は.each
に代わり、代わりに問題を解決すると考えましたが、それはできませんでした。いずれにしても、Rubyがコントローラーの寿命のために電子メールをメモリに保存しているようだ。
私は部分的にタイムアウトの問題であったので、あなたの答えを受け入れました。バックグラウンドジョブは、電子メールごとにテンプレートをレンダリングし、ジョブが完了するまでメモリに保存するため、メモリの問題でした。 HTTP経由でSendGrid APIに送信しても、数百のメッセージの後で、これらのテンプレートはdynoのすべてのメモリを使い果たします。私はおそらく完全にそれを解決するために、SendGridにテンプレートを移動しますが、今のところ私のソリューションは私のニーズに十分な規模に見える。 – ACIDSTEALTH