LoginSignup
1
5

More than 3 years have passed since last update.

sidekiqを使って非同期にメール送信処理をする方法

Last updated at Posted at 2020-03-25

詰まったところ

sidekiqで非同期にメール送信処理を実行する様に実装していたら、メール送信のジョブが待機状態のまま実行されない不具合に遭いました。

結論・解決方法

公式にある通り、以下のコードを実行。
https://github.com/mperham/sidekiq/wiki/Active+Job#action-mailer

bash
$ bundle exec sidekiq -q default -q mailers

次に、deliverdeliver_nowdeliver_laterに変更。
deliver_laterとは、非同期にメール送信処理を行ってくれるメソッドである。
逆に、deliverdeliver_nowは同期的にメール送信するメソッドである。

〇〇_mailer.rb
〇〇Mailer.deliver
〇〇Mailer.deliver_now

〇〇_mailer.rb
〇〇Mailer.deliver_later

これで治るはず(知らんけど)。

もしDockerを使っていたら

sidekiqコンテナをビルドする際に以下コマンドを実行させる。

docker-compose.yml
sidekiq:
    command: bundle exec sidekiq -q default -q mailers

非同期処理を実装する前に

sidekiqでperform_asyncを使って非同期処理をする前に、まずは〇〇Mailer.new.performで同期処理ができるか確認しよう

そもそもとしてそのコードに不備がないかを確認しましょう(僕は不備がありました)。。。。
perform_async非同期処理なので、binding.pryなどブレイクポイントを使うデバッグはできません。
なので、

〇〇_mailer.rb
〇〇Mailer.new.perform(args)

を実行して同期処理で正しく動作しているかを確認しましょう。

sidekiqのログを確認しよう

https://github.com/mperham/sidekiq/wiki/Monitoring#web-ui
sidekiqには、sidekiqで処理するジョブを閲覧できるダッシュボードを用意してくれています。
/sidekiqへアクセスすることで、ダッシュボードからエラーログの確認ができます。
エラーログを見ると、どの様なエラーが吐かれているかを確認できます。
スクリーンショット 2020-03-25 19.54.11.png

sidekiqの処理に渡す引数のデータの型に気をつけよう

https://github.com/mperham/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple
sidekiqに渡す引数のデータ型には制限があります。
シンボル、名前付きパラメーター、複雑なRubyオブジェクト(Date型やTime型など)は使用できません。
使用できる引数のデータの型は、JSONのデータ型のみです。
JSONのデータ型は以下です。

  • 文字列 ("...")
  • 数値 (123, 12.3, 1.23e4 など)
  • ヌル値 (null)
  • 真偽値 (true, false)
  • オブジェクト ({ ... })
  • 配列 ([...])

僕は引数にDate型を渡していましたが、勝手にString型にされ他ので上記の様なエラーが起きました。
なので、Date型の引数をto_sで渡して、Worker内でto_dateすることで解決しました。
みなさんの問題解決に繋がったら幸いです。

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5