499 文字
2 分
メッセージキューでバックグラウンド処理を切り出す

ユーザー操作の応答時間に直接関係しない処理は、その場でやらずに「あとでやる」入れ物に放り込むのが基本です。これがメッセージキューや、その上で動くジョブキューの役割になります。

何を切り出すか#

ユーザー操作の応答に含めると、待ち時間が伸びすぎる処理が候補です。

  • メール/プッシュ通知の送信
  • 画像/動画の変換、サムネイル生成
  • レポートやCSVの生成
  • 外部APIの呼び出し(特に遅いやつ)
  • 集計バッチ、検索インデックスの更新

「ユーザーには 202 Accepted を返してすぐ画面を進ませ、結果は後で通知する」という流れを取れるようにします。

構成要素#

  • プロデューサー:ジョブをキューに投入する側(Webアプリなど)。
  • キュー本体:ジョブを一時保管するミドルウェア(Redis、RabbitMQ、SQS、Cloud Tasks など)。
  • ワーカー:キューから取り出して実際の処理をする常駐プロセス。

ワーカーは台数を増やすだけで処理能力を伸ばせるので、ピーク時の負荷を吸収しやすいのも利点です。

ジョブを書くときの心構え#

  • 冪等に書く:ワーカーが処理中に落ちると同じジョブが再実行されることがあります。「二重に走っても壊れない」前提で書きます。
  • 小さく速く:一つのジョブが長時間走ると、可視性タイムアウトを超えて再実行されたり、デプロイ時に途中で殺されたりします。可能なら細かく分ける。
  • 失敗を前提に:リトライ回数の上限、リトライ間隔(指数バックオフ)、最後にどうするか(デッドレターキュー に逃がす)を決めておく。
  • 観測する:実行時間、失敗率、滞留量のメトリクスを取らないと、詰まりに気づけません。

ジョブキューは「動かして終わり」ではなく、「観測して育てる」性質のインフラだと意識すると、運用が安定します。