🦶

Active Job + Sidekiq 実装メモ

2021/09/26に公開

はじめに

最近 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"

参考: Monitoring | sidekiq

テスト

perform_later

ジョブのテストでは、 perform_later よりも perform_now を優先的に使うこと。perform_later の場合、Redisとの不要な往復が発生するため。

参考

Discussion