SidekiqをRailsに導入する手順をまとめました。
Gemのインストール
Gemfile
# sidekiq本体(必須) gem 'sidekiq' # sidekiqのモニタリング画面で使用 gem 'sinatra', require: false # redisのkeyに任意のprefixを付与させることができる gem 'redis-namespace'
Sidekiqジョブの作成
rails console
rails g sidekiq:job sample
実行するとsample_job.rbが作成されます
app/sidekiq/sample_job.rb
class SampleJob include Sidekiq::Job def perform(*args) # Do something end end
ちなみにインクルードされているSidekiq::Jobは元々はSidekiq::Workerというモジュール名でした。
Workerという言葉の定義が誤解を招くため、SidekiqのOSSプロジェクトではWorkerをJobにリネームするよう動いています。
現状はどちらの名前でも動きますが、ver7では完全移行となるようですので、Sidekiq::Workerを使用している場合は早めにSidekiq::Jobに変更しておくことをおすすめします。
Rename Sidekiq::Worker to Sidekiq::Job · sidekiq sidekiq · Discussion #4971 · GitHub
redisの設定
sidekiqはredisを使用してメッセージングしていますので、開発環境にインストールする必要があります。
redisのインストール方法は各プラットフォームによりますので割愛させていただきます。redisがインストールできたら以下の設定ファイルを作成します。
config/initializers/sidekiq.rb
Sidekiq.configure_server do |config| # redisの設定 config.redis = {url: 'redis://localhost:6379', namespace: "my_app_sidekiq_#{Rails.env}"} end Sidekiq.configure_client do |config| # redisの設定 config.redis = {url: 'redis://localhost:6379', namespace: "my_app_sidekiq_#{Rails.env}"} end
「redis-namespace」のgemによってnamespace: "my_app_sidekiq_#{Rails.env}"
のようにnamespaceを個別に割り振ることができます。
同じredisサーバーを複数の環境で共有する場合などに管理がラクになります。
url: 'redis://localhost:6379'
の部分は環境によって変わる部分ですので環境変数などで切り替えられるようにしておくと良いでしょう。
動作確認
rails console上で実際にJobを起動させてみましょう
rails c > SampleJob.perform_async(1) => "51190418577b3dcafd192368"
sidekiqプロセスのログには以下のようにstartとdoneのログが出力されれOKです。
2022-10-19T05:27:06.508Z pid=1 tid=dnp class=SampleJob jid=51190418577b3dcafd192368 INFO: start 2022-10-19T05:27:06.685Z pid=1 tid=dnp class=SampleJob jid=51190418577b3dcafd192368 elapsed=0.177 INFO: done
モニタリングUIについて
sidekiqではJobの状態をモニタリングできる画面を提供してくれています。
routesファイルに記載の上、指定のURLにアクセスすることで画面を起動することが出来ます。
config/routes.rb
require 'sidekiq/web' Rails.application.routes.draw do root "pages#index" # 下記を追記 mount Sidekiq::Web => "/sidekiq" end
/sidekiq
にアクセスするとモニタリング画面が確認できます。
また、sidekiqにはキューという概念があり、キューごとに優先度を振ることが出来ます。 例えば優先度が2のキューは1のキューよりも2倍の頻度でチェックされるようになります。
Jobごとに優先度を変えたい場合は複数のキューをSidekiqに登録しておいて、Jobごとに割り振ると良いでしょう。