ActionMailerの非同期処理をActiveJob+Sidekiqで

この記事がめっちゃ分かりやすいです。ここに従って進めていきます。

http://qiita.com/QUANON/items/09c87787df6b0d287896

1. Redisをインストール

Redisをインストールします。

$ brew install redis

Redisについては、以下らへんが詳しいと思う。

Redisとは、メモリ上にKey-Valueストア(KVS)を構築することができるソフトウェアの一つ。 http://e-words.jp/w/Redis.html

Redisは,メモリ上で動作するキー・バリュー型の揮発性データベースである。揮発性と聞くと,Redis自身が停止したり,Redisが動作しているハードの電源が切れたりすると,Redisに保存されているデータは消失してしまうように思われるが,Redisはデータをディスクに書き込み,永続化させる機能も持ち合わせているのでそれを回避できる。特徴としては,メモリ上にデータを格納するので,非常に高速にデータの書き込み・読み込みを行うことができる。 http://promamo.com/?p=3358

2. sidekiqをインストール

# Gemfile
gem 'sidekiq'
$ bundle install

3. adapterを登録

RailsのActiveJobのキューアダプタとしてsidekiqを登録します

# config/application.rb
config.active_job.queue_adapter = :sidekiq
$ bundle install

4. redis起動

あらかじめredisを起動しておきます

$ redis-server

5. sidekiqデーモン化

sidekiqの立ち上げは以下のようにできるのですが、ちょっと工夫します。

$ bundle exec sidekiq -q default -q mailers

config/sidekiq.ymlを以下のようにします。

:concurrency: 25
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:queues:
  - default
  - mailers
:daemon: true

このymlファイルを読み込むようにすれば--queueオプションでmailersというキューを用いることとか全部宣言できます。

$ bundle exec sidekiq -C config/sidekiq.yml

6. Action Mailer設定

こんな感じで#deliver_laterを呼びます。

# app/mailers/honoka_mailer.rb
...
  def send_welcome_mail
    UserMailer.welcome(self).deliver_later
  end
...

ActiveJobすげぇ...というかsidekiqすごい...というかRailsすごい。

テストも書きたい...。

追記(2015/09/23): テスト書きました。=> 【RSpec】ActionMailer+ActiveJobのテストを書く - 珈琲駆動開発

参考

実装読むのが一番

https://github.com/rails/rails/blob/v4.2.0/actionmailer/lib/action_mailer/message_delivery.rb