🦶
Active Job + Sidekiq 実装メモ
はじめに
最近 Active Job と 非同期バックエンド (Sidekiq) を使う機会があったので、そのときに得た知見をここに残せたらと思います。
非同期処理を利用するケース
非同期処理は、データ集計して CSV ファイルや Excel ファイルを作るなどの時間がかかる処理で利用されます。時間がかかる処理によりリクエストからレスポンスを返すまでの時間が長くなってしまうときには、先にレスポンスを返しておき、長い時間かかる処理を非同期に別途実行することでユーザーへの応答を早くできます。
引数には Active Record モデルを渡すこと
引数には Active Record モデルを渡し、id を渡さないこと。Active Job は GlobalID を用いて自動的にActive Record モデルをシリアライズ/デシリアライズするので、モデルを手動でデシリアライズする必要はありません。
class SomeJob < ApplicationJob
def perform(model)
do_something_with(model)
end
end
ジョブ内のビジネスロジック
ビジネスロジックはジョブの中に置かず、外に切り出すこと。
Sidekiq 起動方法
ジョブを実行するには、Sidekiq を起動する必要があります。
$ bundle exec sidekiq
キューを指定して起動
-q
オプションを使うことで キューを指定して Sidekiq を起動できます。
$ bundle exec sidekiq -q キュー名
Sidekiq 設定ファイル
Sidekiq の設定ファイルは、config/sidekiq.yml
になります。このファイルでキューなどの設定を行います。
The Sidekiq Configuration File | sidekiq
ダッシュボード
Sidekiq にはダッシュボードを表示できる Web アプリケーションが付属しています。
ルーティングに以下のコードを追加することで、ダッシュボードを見ることができます。
mount Sidekiq::Web => "/sidekiq"
テスト
perform_later
ジョブのテストでは、 perform_later
よりも perform_now
を優先的に使うこと。perform_later の場合、Redisとの不要な往復が発生するため。
Discussion