📕
詳解 Sidekiq Config
はじめに
sidekiq に関する設定は yml などで定義可能である。
しかしながら、公式ドキュメントの説明があまりにも不足していると感じた。
私の参加するプロジェクトの config/sideki.yml には、timeout
という項目があった。
当初、私はこう推測した。
「job が performing 状態になってから、タイムアウトするまでの n 分 を定義しているのでは?」
そこで、この推測が正しいかどうか判断するためにドキュメントをさらった。
具体的には、下記に config の定義の説明が述べられている。
しかし、timeout
に関する説明が、ない・・・。
結局、ソースコードを読みに行って解決した。
ドキュメントを漁ったり AI に聞いたりと効率の悪い作業だったので、メモ書き兼私のような思いをする人が少しでも減るように、config の内容を2025年9月4日現在のソースを引用しつつまとめておく。
Sidekiq 設定オプション詳細解説
基本設定 (ファイル例:config/sidekiq.yml)
コア設定
:concurrency
(デフォルト: 5)
- 説明: Sidekiq プロセスが使用するワーカー スレッド数
- ソース: lib/sidekiq/config.rb:15
- 詳細: 各 Sidekiq プロセスで同時実行可能なジョブ数を制御。高い値は並行性を向上させるが、CPU とメモリ使用量が増加
-
設定例:
:concurrency: 10
:timeout
(デフォルト: 25秒)
- 説明: Sidekiq プロセスが quiet になってから shutdown するまでの猶予時間
- ソース: lib/sidekiq/config.rb:16
-
詳細: launcher.rb:58で
deadline = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC) + @config[:timeout]
として使用 -
CLIオプション:
-t, --timeout NUM
(cli.rb:361-363)
:environment
(デフォルト: nil)
- 説明: アプリケーションの実行環境
- ソース: lib/sidekiq/config.rb:14
- 詳細: APP_ENV、RAILS_ENV、RACK_ENV の順で環境変数から自動検出される (cli.rb:236)
キュー設定
:queues
- 説明: 処理するキューのリストと重み付け
- ソース: capsule.rb:57-75
-
モード:
-
:strict
- 重み0、順序固定で処理 -
:weighted
- 重み付きランダム処理 -
:random
- 全キュー重み1でランダム処理
-
-
設定例:
:queues: - critical - [default, 2] # 重み付き - low
スケジューリング設定
:average_scheduled_poll_interval
(デフォルト: 5秒)
- 説明: スケジュールされたジョブの Redis チェック間隔
- ソース: lib/sidekiq/config.rb:18
- 詳細: 各プロセスがこの値の倍数だけ待機してから Redis をチェック
:poll_interval_average
(デフォルト: nil)
- 説明: 廃止予定の設定項目
- ソース: lib/sidekiq/config.rb:17
エラーハンドリング設定
:error_handlers
(デフォルト: [])
- 説明: エラー処理のためのプロシージャ配列
- ソース: lib/sidekiq/config.rb:24
- 詳細: デフォルトでは ERROR_HANDLER が自動追加される (config.rb:64)
:death_handlers
(デフォルト: [])
- 説明: ジョブが最終的に失敗した際のハンドラー
- ソース: lib/sidekiq/config.rb:25
:on_complex_arguments
(デフォルト: :raise)
- 説明: 複雑な引数に対する処理方法
- ソース: lib/sidekiq/config.rb:19
Dead Job 設定
:dead_max_jobs
(デフォルト: 10,000)
- 説明: Dead キューに保持する最大ジョブ数
- ソース: lib/sidekiq/config.rb:36
:dead_timeout_in_seconds
(デフォルト: 15,552,000秒 = 6ヶ月)
- 説明: Dead ジョブの保持期間
- ソース: lib/sidekiq/config.rb:37
-
計算:
180 * 24 * 60 * 60
= 180日 × 24時間 × 60分 × 60秒
ライフサイクルイベント設定
:lifecycle_events
(デフォルト: 各イベント用空配列)
- 説明: プロセスライフサイクルの各段階でのコールバック設定
- ソース: lib/sidekiq/config.rb:26-35
-
イベント種類:
-
startup
: プロセス開始時 -
quiet
: quietモード移行時 -
shutdown
: シャットダウン開始時 -
exit
: プロセス終了時 -
heartbeat
: 初回ハートビートまたはネットワーク復旧時 -
beat
: 10秒ごとの定期ハートビート
-
Iteration 設定
:iteration
(デフォルト: {})
- 説明: バッチ ジョブのイテレーション設定
- ソース: lib/sidekiq/config.rb:20-23
-
サブオプション:
-
max_job_runtime
: 最大実行時間 (nil = 無制限) -
retry_backoff
: リトライ時のバックオフ時間 (デフォルト: 0秒)
-
その他の設定
:labels
(デフォルト: Set.new)
- 説明: プロセスに付与するラベルセット
- ソース: lib/sidekiq/config.rb:12
:require
(デフォルト: ".")
- 説明: 読み込むアプリケーションのパス
- ソース: lib/sidekiq/config.rb:13
-
CLIオプション:
-r, --require [PATH|DIR]
(cli.rb:357-359)
:reloader
(デフォルト: proc { |&block| block.call })
- 説明: コードリロード用のプロシージャ
- ソース: lib/sidekiq/config.rb:38
:backtrace_cleaner
(デフォルト: ->(backtrace) { backtrace })
- 説明: バックトレースのクリーンアップ用プロシージャ
- ソース: lib/sidekiq/config.rb:39
CLI オプション
以下のオプションがコマンドラインから指定可能:
-
-c, --concurrency INT
: 並行実行数 (cli.rb:340-342) -
-e, --environment ENV
: 実行環境 (cli.rb:344-346) -
-g, --tag TAG
: プロセスタグ (cli.rb:348-350) -
-q, --queue QUEUE[,WEIGHT]
: キューと重み (cli.rb:352-355) -
-v, --verbose
: 詳細ログ出力 (cli.rb:365-367) -
-C, --config PATH
: 設定ファイルパス (cli.rb:369-371)
Capsule 設定
Sidekiq 7.0 以降、特定のキューを独立した Capsule として設定可能:
Sidekiq.configure_server do |config|
config.capsule("unsafe") do |cap|
cap.concurrency = 1
cap.queues = %w[queue_a queue_b] # strict priority
end
end
各 Capsule は独自の並行実行数とキュー設定を持つ (capsule.rb:32-39)。
設定例
基本的な設定ファイル例
---
:concurrency: 5
:timeout: 30
:queues:
- critical
- default
- low
:labels:
- worker_type:background
# 環境別設定
staging:
:concurrency: 10
:timeout: 60
production:
:concurrency: 25
:timeout: 25
:dead_max_jobs: 50000
:dead_timeout_in_seconds: 7776000 # 3ヶ月
プログラムによる設定例
Sidekiq.configure_server do |config|
# エラーハンドラーの追加
config.error_handlers << proc { |ex, ctx|
ErrorReportingService.notify(ex, ctx)
}
# デスハンドラーの追加
config.death_handlers << proc { |job, ex|
SlackNotifier.notify("Job #{job['class']} failed permanently: #{ex}")
}
# ライフサイクルイベント
config.on(:startup) do
puts "Sidekiq starting up!"
end
config.on(:shutdown) do
puts "Sidekiq shutting down!"
end
end
Discussion