⚙️

Sidekiqはどう動くのか?

Redisベースのバックグラウンドジョブキューシステム

SidekiqはRubyの代表的なバックグラウンドジョブプロセッサです。Webリクエスト中の時間がかかるタスクをRedisキューにシリアライズされたジョブとして投入し(perform_async)、別のSidekiqワーカープロセスがマルチスレッドでキューからジョブを取り出して処理します。Webプロセスは即座にレスポンスを返すことができ、実際の処理はバックグラウンドで行われます。失敗したジョブは自動リトライされ、Dead状態のジョブはWeb UIでモニタリング可能です。

構造ダイアグラム

🌐
Webプロセス
Rails / Puma
MyWorker.perform_async(id)
① LPUSH (enqueue)
🗄️
Redis
queue:default queue:mailers retryセット deadセット
② BRPOP (dequeue)
⚙️
Sidekiqワーカー
マルチスレッドプロセス
Thread 1: メール Thread 2: エンコード Thread 3: 待機
失敗時のリトライフロー:
失敗 retryキュー(exponential backoff) 25回リトライ Deadキュー
キーポイント
  • Webプロセスとワーカープロセスは<strong>別プロセス</strong>(同じコードベース)
  • Redisがキューの役割 — ジョブはJSONでシリアライズ
  • BRPOP: キューが空ならブロッキング待機(ポーリングではない)
  • ワーカーはマルチスレッドで同時に複数ジョブを処理

動作フロー

1

WebリクエストでMyWorker.perform_async(args)を呼び出し

2

ジョブ情報がJSONにシリアライズされRedisキューにLPUSH

3

SidekiqワーカープロセスがRedisからBRPOPでジョブを取り出し

4

ワーカーがperform(args)メソッドを実行(別スレッド)

5

成功時ジョブ削除、失敗時retryキューに移動(exponential backoff)

6

最大リトライ超過時Deadキューに移動(手動確認が必要)

メリット

  • Web応答速度の改善(重いタスクの分離)
  • 自動リトライ(exponential backoff)
  • マルチスレッドによる高スループット
  • Sidekiq Web UIでモニタリング

デメリット

  • Redis依存(Redisダウン = ジョブ処理停止)
  • ジョブシリアライズの制約(複雑なオブジェクト渡し不可)
  • マルチスレッド安全性への注意
  • 重複実行の可能性(冪等性が必要)

ユースケース

メール/通知送信 画像/動画エンコーディング 外部API呼び出し(決済、配送) CSV/PDFの大量生成 データ同期/整理