1
/
5

障害対応等でSidekiq APIを使うときのTips

Photo by Arno Senoner on Unsplash

はじめに

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"]  # ジョブ引数リスト
Wantedly, Inc.'s job postings
5 Likes
5 Likes

Weekly ranking

Show other rankings
Invitation from Wantedly, Inc.
If this story triggered your interest, have a chat with the team?