2016-08-30 11 views
2

deliver_later経由でメールを送信しているHeroku 4アプリがあります。 Sidekiqは動作しており、私の設定にはconfig.active_job.queue_adapter = :sidekiqがあります。エラー:Herokuで1秒間に多くの電子メールが届いています

また、ログ[ActiveJob] [ActionMailer::DeliveryJob]でこれを見ると、メールがバックグラウンドジョブとして送信されていると思われます。

なぜ、1秒間にあまりにも多くのメールについてエラーが発生するのですか?

Net::SMTPUnknownError: could not get 3xx (550: 550 5.7.0 Requested action not taken: too many emails per second

私はちょうど私がsidekiq同時実行が3に設定しているたぶんそれが問題だ気づきましたか? 1つの修正問題への同時実行を設定するが、私はすべてのジョブを単一の作業員によって処理されないようにする:

答えて

1

は間違いなく3

追加情報に設定sidekiqの同時実行の問題のようです。 Sidekiqがキューごとに並行処理を使用するようにして電子メールが単一のワーカーを使用できるようにし、他のジョブが複数のワーカーを使用できるようにすることは素晴らしいことです。しかし、sidekiqの作者はそれは不可能だと言った。

私は、特定の問題hereのherokuを使って解決しました。これは、各キューをそれ自身のheroku dynoに入れて、各dynoで並行性を設定することができます。

1

これはSidekiqとは関係ありません(とにかく、直接ではありません)。これは、使用しているSMTPサーバーとサーバーのレート制限に関するものです。 Sidekiqが同時に複数のメールを送信した場合、レート制限が比較的低い場合にこのエラーが発生する可能性があります。

たとえば、開発環境またはステージング環境でSMTPサーバーとしてメールトラップを使用している場合、無料アカウントは1秒あたり2メールに制限されます。このエラーはかなり簡単に実行できます。

、あなたの目的のために、この問題に実行して避けることができない場合は、あなたがactionmailerののdeliver_later method、例えばのためのキーワード引数「待機」を使用して、いくつかの異なる戦略を試すことができますが:

users_i_need_to_email.each_with_index do |user, index| 
    t = 5 * index 
    UserMailer.send_important_stuff(user) 
      .deliver_later(wait: t.seconds) 
end 

た場合には、あなたの:deliver_later呼び出しが異なるプロセスやフローで動作している場合、配信時間を無作為化することで(例えば、ランダムな時間が最大5分間)取り除くことができます。

上記のいずれの解決策も完全な証明ではないため、目的に合ったSMTPサーバーを使用することをお勧めします。

+0

あなたの言うことはすべて真です。私の最初の解決策は、ランダムな遅延を使用することでしたが、ハックのように感じられ、遅延が気に入らなかった。だから今私の解決策は、私のメーラーキューをそれ自身のdynoに入れ、並行性を1に設定することです。まだハックしますが、ハッキリしていないように感じます。 heh – Dty

+0

ActionMailerでエラーをキャッチして再試行してみるとよいでしょう。これはうまくいくかもしれません:あなたのメーラーを処理するためにSidekiqジョブを使用し、 'deliver_later'の代わりに 'deliver_now'でメーラーに電話をかけ、Sidekiqにこれらのエラーをキャッチして再試行させます。 (また不自然に見えます:/) – niborg

+0

別のプロジェクトでも同様のことが起こっています。 Sidekiqは問題を残さずに1年以上にわたりエラーを再試行していますので、修正することは決してありません。 – Dty

関連する問題