499 文字
2 分
メッセージキューでバックグラウンド処理を切り出す
ユーザー操作の応答時間に直接関係しない処理は、その場でやらずに「あとでやる」入れ物に放り込むのが基本です。これがメッセージキューや、その上で動くジョブキューの役割になります。
何を切り出すか
ユーザー操作の応答に含めると、待ち時間が伸びすぎる処理が候補です。
- メール/プッシュ通知の送信
- 画像/動画の変換、サムネイル生成
- レポートやCSVの生成
- 外部APIの呼び出し(特に遅いやつ)
- 集計バッチ、検索インデックスの更新
「ユーザーには 202 Accepted を返してすぐ画面を進ませ、結果は後で通知する」という流れを取れるようにします。
構成要素
- プロデューサー:ジョブをキューに投入する側(Webアプリなど)。
- キュー本体:ジョブを一時保管するミドルウェア(Redis、RabbitMQ、SQS、Cloud Tasks など)。
- ワーカー:キューから取り出して実際の処理をする常駐プロセス。
ワーカーは台数を増やすだけで処理能力を伸ばせるので、ピーク時の負荷を吸収しやすいのも利点です。
ジョブを書くときの心構え
- 冪等に書く:ワーカーが処理中に落ちると同じジョブが再実行されることがあります。「二重に走っても壊れない」前提で書きます。
- 小さく速く:一つのジョブが長時間走ると、可視性タイムアウトを超えて再実行されたり、デプロイ時に途中で殺されたりします。可能なら細かく分ける。
- 失敗を前提に:リトライ回数の上限、リトライ間隔(指数バックオフ)、最後にどうするか(デッドレターキュー に逃がす)を決めておく。
- 観測する:実行時間、失敗率、滞留量のメトリクスを取らないと、詰まりに気づけません。
ジョブキューは「動かして終わり」ではなく、「観測して育てる」性質のインフラだと意識すると、運用が安定します。