- バックエンド / リーダー候補
- PdM
- Webエンジニア(シニア)
- 他19件の職種
- 開発
- ビジネス
はじめに
Sidekiq は主にRuby on Rails用に広く使われているジョブキューです。
Sidekiqは通常Ruby on Railsのアプリケーションコードから呼び出される形で使われますが、障害対応などのために管理画面やRuby APIからの操作が必要になることもあります。本稿ではSidekiqのRuby APIを使うときのTipsをまとめました。
公式の資料
いつAPIが必要か
溜まりすぎたジョブを削除したり、失敗しすぎて停止してしまったジョブの調査・再実行をしたりといった作業が必要になることがあります。
こういった調査と操作は管理画面からでもできますが、ある程度の自動化 (特定条件を満たすジョブを全てドロップするなど) が必要なときにはAPIが有用です。そのため本稿ではジョブ操作APIに特化して説明します。
呼び出し方
require "sidekiq/api"
Rails consoleの場合は上記は不要です。
キュー
以下のキューがあります。
- Sidekiq::Queue ... 通常の名前つきキュー。時間指定なしでエンキューされたジョブはここに入る。
- Sidekiq::ScheduledSet ... 時刻待ちのジョブが入っているキュー。
- Sidekiq::RetrySet ... 実行に失敗し、次の実行時間を待っているジョブのためのキュー。
- Sidekiq::DeadSet ... 実行に失敗し、もはや自動では再実行されないジョブのためのキュー。
正確には、後の3つはQueueではなくSortedSetとして実装されており、 Sidekiq::JobSet を継承しています。
キューの使い方
newをするとキューAPIのクライアントが生成されます。newした時点ではRedisへのアクセスは行っていません。
q = Sidekiq::Queue.new("mailer") # 省略すると "default" になる
q = Sidekiq::ScheduledSet.new
q = Sidekiq::RetrySet.new
q = Sidekiq::DeadSet.new
キューの基本APIは #each (Queue#each, JobSet#each) です。ただし、これらのオブジェクトは Enumerable を実装していないため、高度な操作には to_enum を使う必要があります。
q.each { |j| j.retry }
# each以外のことをするには #to_enum が必要
jobs = q.to_enum.filter { |j| j.klass === "MyJob" }
ジョブの使い方
ジョブは Sidekiq::JobRecord です。特殊キューのジョブは追加のAPIを持っています (Sidekiq::SortedEntry を参照)
よく使う属性
job.klass # ジョブクラス名
job.args # ジョブ引数リスト
job.enqueued_at # 実行予定時刻
よく使う基本操作
job.delete # キューから強制的に削除する
job.retry # 強制的にリトライ (SortedEntryのみ)
ActiveJobの場合
ActiveJob経由の場合、実際にSidekiqにエンキューされるのは ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper というラッパージョブです。
中のジョブ情報を取り出すには以下のようにします。
job.item["wrapped"] # ジョブクラス名
job.args[0]["job_class"] # ジョブクラス名 (この方法でも取れる)
job.args[0]["arguments"] # ジョブ引数リスト