-->

Railsを用いたメールジョブの永続化の実装方法

Posted by : on

Category : Rails


メールのジョブの永続化を実装

  メールのジョブを永続化させます。そもそもメールのジョブは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)

実際にsessionデータを覗いてみました。 Image from Gyazo Image from Gyazo

個人的に、Redis攻略のためにこの本をいつか読破したいすね^^ (めちゃくちゃ難しいらしいので燃える)

Image from Gyazo

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の二つのキューを用意します。以下のアーキテクチャの概要を見るとわかりやすいと思います。

Image from Gyazo



下のコマンドで先ほどsidekiq.ymlで設定したsidekiqを起動します。起動しないとsidekiqが待機状態になってメール送信されないので必須です!

$bundle exec sidekiq


localhost:3000/sidekiqに飛んでみましょう。下のような画面が出てくると思います。 先述しましたが、ActionMailerはデフォルトでActiveJobが統合されているので、ジョブ管理のライブラリを設定するだけで永続化の実装ができます。

Image from Gyazo

これでsidekiqを導入し、メールの永続化を実装することができました。

参考記事

Ruby on rails x Redisでsessionを高速化しよう! Railsでクエリ結果をキャッシュしてDB負荷を軽減する メッセージキューイング 【MQ】 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 Redisの特徴と基本的な使い方をわかりやすく解説! Sidekiqチューニングのためのパラメータ整理


About Nobuteru Arai
Nobuteru Arai

I've been learning web development in the Apprenticeship course.

Email : ara.ct0619@gmail.com

Website : https://github.com/aratetete0619

-->
About tetete0619

Hi, my name is tetete. I've been learning web development in the Apprenticeship course.

Star
Useful Links