メッセージキュー

プロデューサーとコンシューマーを非同期に接続し、メッセージを一時的に保持する通信基盤

非同期アーキテクチャ

メッセージキューとは

メッセージキュー (Message Queue) は、プロデューサー (送信者) とコンシューマー (受信者) を非同期に接続し、メッセージを一時的に保持する通信基盤である。AWS では SQS が代表的なメッセージキューである。

同期 vs 非同期 (キュー)

同期と非同期 (キュー) の違いを図で示す。

同期:
  API → 処理 (5秒) → レスポンス
  → ユーザーが 5 秒待つ

非同期 (キュー):
  API → SQS にメッセージ送信 → レスポンス (即時)
  SQS → Lambda (バックグラウンドで処理)
  → ユーザーは待たない

メッセージキューのメリット

重い処理をバックグラウンドに回す非同期処理が可能になり、トラフィックの急増をバッファリングで吸収できる。プロデューサーとコンシューマーが独立するため疎結合になり、失敗したメッセージの自動リトライも実現できる。コンシューマーを増やすだけで並列処理をスケールできる。

SQS vs SNS vs EventBridge

SQS・SNS・EventBridge の違いを以下にまとめる。

サービスパターン用途
SQSキュー (1 対 1)バックグラウンド処理
SNSPub/Sub (1 対多)ファンアウト通知
EventBridgeイベントバス (1 対多)イベント駆動、フィルタリング

SQS Standard vs FIFO

SQS Standard と FIFO の違いを以下にまとめる。

観点StandardFIFO
順序ベストエフォート厳密な順序保証
重複At-least-onceExactly-once (5 分の重複排除インターバル内)
スループットほぼ無制限既定は 300 リクエスト/秒・バッチで 3,000 msg/秒
用途一般的な非同期処理順序が重要な処理

FIFO の上限はメッセージ数ではなく API リクエスト数で数える。既定モードでは 1 パーティションあたり SendMessage などの API 単位で 300 リクエスト/秒、10 件バッチなら 3,000 msg/秒まで。高スループットモード (重複排除スコープをメッセージグループ単位に切り替える設定) を有効にすると上限は大きく変わり、公式クォータでは 2026 年 8 月時点でバージニア北部・オレゴン・アイルランドがバッチ無し 70,000 リクエスト/秒、オハイオ・フランクフルトが 19,000 リクエスト/秒である。「FIFO は 3,000 で天井だから Standard」と決める前に、このモードが使えるかを確認する。

FIFO の Exactly-once も無条件ではない。5 分の重複排除インターバル内に同じ重複排除 ID で SendMessage を再試行した場合に重複が入らないという保証であり、それを超えた再送は別のメッセージとして通る。

デッドレターキュー (DLQ)

デッドレターキュー (DLQ) を図で示す。

メッセージ処理失敗 (1 回目) → リトライ
メッセージ処理失敗 (2 回目) → リトライ
メッセージ処理失敗 (3 回目) → DLQ に移動
→ DLQ のメッセージを調査・再処理

このリトライは、SQS が失敗を検知して押し込み直すものではない。コンシューマーが可視性タイムアウトの間に削除しなかったメッセージが、再びキューで受信可能になるだけである。既定の可視性タイムアウトは 30 秒で、ChangeMessageVisibility で延長しても最初の受信から 12 時間が上限。受信回数が再ドライブポリシーの maxReceiveCount を超えた時点で DLQ へ移る。処理に 30 秒以上かかる実装で既定値のままにすると、まだ動いている処理のメッセージが別のコンシューマーへ渡り、二重処理を起こしたうえで DLQ に溜まる。

詳しくは関連書籍を参照。

この記事は役に立ちましたか?

関連用語

関連する記事