About

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の大量生成 データ同期/整理
← GitHub Webhookはどう動くのか? WebRTCはどう動くのか? →