Heroku上でRailsアプリを運用しているものです。
バージョンはRailsが5.2.1
で、Sidekiqが6.0.4
です。
workerとして「Heroku Redis」を連携しており、そちらでメール送信などを捌かせているのですが、アプリの「お知らせ通知」といった、4000人近くのユーザーにメールを送る処理を実行しようとすると、どうも一部のユーザーにはメールが届いていないようなのです。
rb
1# アプリないで実際にやっている処理。(ループ数は4000くらい) 2User.where(is_news_notice_on: true).each do |user| 3 NewsMailer.published(News.last, user).deliver_later 4end
ログを確認してみたところ、下記のように、ジョブとしてキューにプッシュされた個数は、対象ユーザーの人数と一致しました。
つまり、キューにジョブを格納するところまでは正常に動いています
Enqueued ActionMailer::DeliveryJob (略) to Sidekiq(mailers) with arguments: "NewsMailer", "published", "deliver_now"
しかし下記のように、キューから取り出されたジョブ数は、プッシュされた個数よりも少なくなっていました。(800個くらい減っていた)
Performing ActionMailer::DeliveryJob (略) from Sidekiq(mailers) with arguments: "NewsMailer", "published", "deliver_now"
可能性は以下のようなものを考えたのですが、果たしてそれが現実的な結論かどうかがわかりません
- Redis x Sidekiqによる非同期ジョブ処理は「ベストエフォート方式」のため、一気に大量のタスクが突っ込まれると失敗する確率が上がる。
- Sidekiqは他にも「登録確認メール」などのジョブにも使っているため、それらの処理とぶつかって中断されてしまった
- 一気に4000件近くもメールを送るための「Redisのメモリ」が足りていない。
どなたかRedis x Sidekiqの運用に詳しい方などいらっしゃいましたら、教えて欲しいです!
よろしくお願いします!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/16 05:33 編集
2020/02/16 21:28
2020/02/17 01:45
2020/02/17 02:24 編集
2020/02/17 06:10