はじめに
1月18日に開催された Saitama.rb#25 に参加してきました。
Saitama.rb とは
埼玉に住んでいるRubyistのコミュニティです。詳細は以下をご覧ください。
参加した感想
自分以外の人がいる状態のもくもく会は非常に集中できる環境だと感じています。家の外で集中して勉強できる場があるのはとても有難いです。 10年以上Railsに携わっている方から、現在Rubyを学習中の方まで幅広い参加者がいらっしゃいました。
もくもく会の成果
今回は Shoryuken gemの検証や、ActiveJob、ActionMailer の仕様について深く学ぶことができました。
Shoryuken gem
ActiveJobのperform_laterとperform_nowの違い
(perform_laterは)ジョブをキューに入れ、キューが空き次第ジョブを実行する。(To enqueue a job to be performed as soon as the queuing system is free) (perform_nowは)キューに入ることなく即座に実行される。(A job can also be processed immediately without sending to the queue) もう少し簡単にいうと、perform_laterは非同期的に実行され、perform_nowは同期的に実行されます
ActionMailerのdeliver_laterとdeliverの違い
deliver_later
Active Jobを介して配信される電子メールをキューに入れます。
ジョブを実行すると、deliver_now
を使用して電子メールが送信されます。
やってみたいこと
- Railsアプリのメール送信処理を非同期にしたい
- ActiveJobのキューはAWS SQSを使ってみたい
- 図にするとこんな感じ?
非同期処理後にメールを送信する際の実装イメージ
- このケースは、非同期処理後にメールを送る場合
- 例
- 業務アプリのバックアップ取得後にメールを送る
- なにかのデータを集計後にメールを送る
- 例
- RailsアプリからActiveJobをSQSにキュー登録
class hogeController < ApplicationController def index HelloJob.perform_later end
- Shoryuken workerがSQSのキューをポーリング
- Shoryuken workerがActiveJobを実行
- SESからメール送信
class HelloJob < ActiveJob::Base queue_as 'hello' def perform ApplicationMailer.welcom_email.deliver_later end
非同期でメールを送りたいだけならこれでOK
- RailsのControllerからメール送信のActiveJobをSQSにキュー登録
class hogeController < ApplicationController def index # Active Jobを使用して後でメール送信したい場合は#deliver_laterを使用 ApplicationMailer.welcom_email.deliver_later # 内部的には、ActionMailer::DeliveryJobが動く # DeliveryJob.perform_later end end
- Shoryuken workerがSQSのキューをポーリング
- Shoryuken workerがActiveJobを実行
まとめ
主催していただいたタケユーウェブの竹内さんに感謝です。いつもありがとうございます! 次回はメタプログラミングRubyの学習で参加したいと思います。