メッセージキュー
プロデューサーとコンシューマーを非同期に接続し、メッセージを一時的に保持する通信基盤
メッセージキューとは
メッセージキュー (Message Queue) は、プロデューサー (送信者) とコンシューマー (受信者) を非同期に接続し、メッセージを一時的に保持する通信基盤である。AWS では SQS が代表的なメッセージキューである。
同期 vs 非同期 (キュー)
同期と非同期 (キュー) の違いを図で示す。
同期:
API → 処理 (5秒) → レスポンス
→ ユーザーが 5 秒待つ
非同期 (キュー):
API → SQS にメッセージ送信 → レスポンス (即時)
SQS → Lambda (バックグラウンドで処理)
→ ユーザーは待たない
メッセージキューのメリット
重い処理をバックグラウンドに回す非同期処理が可能になり、トラフィックの急増をバッファリングで吸収できる。プロデューサーとコンシューマーが独立するため疎結合になり、失敗したメッセージの自動リトライも実現できる。コンシューマーを増やすだけで並列処理をスケールできる。
SQS vs SNS vs EventBridge
SQS・SNS・EventBridge の違いを以下にまとめる。
| サービス | パターン | 用途 |
|---|---|---|
| SQS | キュー (1 対 1) | バックグラウンド処理 |
| SNS | Pub/Sub (1 対多) | ファンアウト通知 |
| EventBridge | イベントバス (1 対多) | イベント駆動、フィルタリング |
SQS Standard vs FIFO
SQS Standard と FIFO の違いを以下にまとめる。
| 観点 | Standard | FIFO |
|---|---|---|
| 順序 | ベストエフォート | 厳密な順序保証 |
| 重複 | At-least-once | Exactly-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 に溜まる。
詳しくは関連書籍を参照。
この記事は役に立ちましたか?
関連用語
SNS と SQS
AWS のメッセージングサービスで、SNS がパブリッシュ/サブスクライブ、SQS がメッセージキューを提供する
SQS FIFO キュー
メッセージの順序保証と厳密な 1 回配信を提供する Amazon SQS のキュータイプ
キューワーカー
メッセージキューからタスクを取り出して非同期に処理するバックグラウンドプロセス
デッドレターキュー
処理に失敗したメッセージを退避させ、後から調査 / 再処理するためのキュー
Pub/Sub
発行者と購読者が直接通信せず、メッセージブローカーを介して非同期にメッセージを交換するパターン
SNS ファンアウト
SNS トピックから複数の SQS キューや Lambda に同時配信し、1 つのイベントで複数の処理を並行実行するパターン