メールのジョブの永続化を実装
メールのジョブを永続化させます。そもそもメールのジョブはRailsで非同期での処理を行ってくれますが、再起動すると全てのジョブが失われてしまいます。なので、サードパーティとしてジョブ管理インフラを配置して永続化します。今回は、sidekiqというライブラリを使用します。
sidekiqとは?
sidekiqとは、バックグラウンドでジョブを管理してくれるライブラリです。sidekiqを使うには、Client、Sever、Redisの3つが必要です。今回の場合は、RailsがCliantになります。Redisはjobをキューイングするために使います。キューイングとは、ひとつひとつの保管されているjobを順番どおりに渡す方法のことを言います。要するにRailsとSidekiqのServerの受け渡しを担っています。
ActiveJobとは?
ActiveJobとは、様々なバックグラウンドジョブ管理ライブラリに対応したRailsにおけるアダプタです。Sidekiqだけでなく、Resque、Delayed Jobを使用したい場合にいちいちそれぞれのライブラリに対応した記述でなくてもActiveJobのおかげで共通したインターフェイスとしてジョブを記述できます。アダプタとして使用しない場合もデフォルトで非同期処理を行なってくれますが再起動するとジョブは失われます。デフォルトでActionMailerに統合されているので、今回の場合はメールのジョブはjob下で設定しなくても大丈夫です。
Redisの導入
Redisをインストールしていない場合は導入してくだい。
$brew install redis
インストールしたらredisを起動しておきましょう!
$redis-server
ローカルで導入できたので、Railsに導入します。 Gemfile
gem 'redis-rails'
config/application.rb
config.cache_store = :redis_store, 'redis://localhost:6379/0/cache', { expires_in: 90.minutes }
Redisのメリット
シンプルかつ高速であるため一時的なデータ保存先として重宝される。下記はRailsに使用される一例である。今回は、大量データ送信データの項目が当てはまる。
- キャッシュ
- セッションデータ(cookieでなく、Redisサーバーで保存しておけばセキュリティリスクが軽減できる)
- 大量データ送信データ(ActiveJob)
個人的に、Redis攻略のためにこの本をいつか読破したいすね^^ (めちゃくちゃ難しいらしいので燃える)
sidekiqの導入
sidekiqを導入します。sinatraはsidekiqのダッシュボードを使うのに入れています。
Gemfile
gem 'sidekiq'
gem 'sinatra', require: false
config/application.rb
config.active_job.queue_adapter = :sidekiq
config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://localhost:6379' }
end
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://localhost:6379' }
end
config/routes.rb
require 'sidekiq/web'
if Rails.env.development?
mount Sidekiq::Web, at: '/sidekiq'
end
sidekiqに設定を加えます。
config/sidekiq.yml
:concurrency: 25
:queues:
- default
- mailers
concurrencyはスレッドの数を指定しています。スレッドとはプログラム処理の実行単位です。また、queuesでは、defaultとmailersの二つのキューを用意します。以下のアーキテクチャの概要を見るとわかりやすいと思います。
下のコマンドで先ほどsidekiq.ymlで設定したsidekiqを起動します。起動しないとsidekiqが待機状態になってメール送信されないので必須です!
$bundle exec sidekiq
localhost:3000/sidekiqに飛んでみましょう。下のような画面が出てくると思います。 先述しましたが、ActionMailerはデフォルトでActiveJobが統合されているので、ジョブ管理のライブラリを設定するだけで永続化の実装ができます。
これでsidekiqを導入し、メールの永続化を実装することができました。
参考記事
Ruby on rails x Redisでsessionを高速化しよう! Railsでクエリ結果をキャッシュしてDB負荷を軽減する メッセージキューイング 【MQ】 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 Redisの特徴と基本的な使い方をわかりやすく解説! Sidekiqチューニングのためのパラメータ整理