55. 配信保証の地図 — 4つのサービスを同じ物差しで並べる
SQS・SNS・Kinesis・EventBridgeを『配信保証・順序・push/pull・保存の性質』という4本の物差しで並べ、どれをいつ使うかが暗記でなく導出になる様子を図で追っていきます。
① 土台はどれもat-least-once — 「1回以上」しか約束しない
- SQS標準の公式表現: 「Standard queues ensure at-least-once message delivery … more than one copy of a message might be delivered」。重複と順序の乱れは『highly distributed architecture(高度に分散した構造)』の帰結と説明される
- at-least-onceは『失敗したら再送』の当然の代償。exactly-onceを本当に達成するのは分散システムでは高価なので、多くのサービスがこの土台を選ぶ
- 既習: Lambdaの非同期呼び出し・イベントソースマッピングも同じat-least-once。だから消費側の冪等化は本編を通した共通処方
4サービスに共通する最下層はat-least-once=『少なくとも1回、ただし2回以上もありうる』。原因は違ってもすべて再送に行き着き、だから受信側の冪等性が全編共通の答えになる。
② exactly-onceは「魔法」ではなく重複排除ID+ロックの工学
- 『exactly-once』はネットワークが魔法で1回配信になるのではなく、重複排除ウィンドウ+可視性タイムアウトという2つの工学的仕掛けで『実質1回処理』に近似したもの
- 公式: 「If you retry the SendMessage action within the 5-minute deduplication interval, Amazon SQS doesn't introduce any duplicates into the queue」。IDは明示指定のほか、本文のSHA-256ハッシュから自動生成(content-based deduplication)もできる
- DynamoDB編のパーティションキー、SQS FIFOのメッセージグループID、Kinesisのシャードはすべて『何かのスコープを区切るキー』という同型。ここでは重複排除IDが『冪等のスコープを区切るキー』
FIFOの『exactly-once』は例外ではなく、at-least-onceの土台の上に重複排除IDと可視性タイムアウト(ロック)を積んだ工学的近似。仕組みが見えれば『なぜFIFOは遅いか』も『なぜ標準は速いか』も同じ天秤の両端として読める。
③ 順序は「常に何かの単位の中でだけ」保証される
- FIFOのグループID、Kinesisのシャード(パーティションキーのMD5ハッシュで決まる)は『順序を保つ単位』。同じキーのものだけ順序が揃う
- Kinesis公式: シーケンス番号は『unique per partition-key within its shard』。順序はシャードをまたがない
- 既習との一致: DynamoDB編のパーティションキーと同じ原理。『順序のスコープ=並列のスコープ』を区切るキーが必ず1つある
順序保証は『あり/なし』の二択ではなく『どの単位の中でなら順序が立つか』の問い。標準SQS=単位なし、FIFO=グループID、Kinesis=シャード。狭い単位で順序を買うほど並列性を手放すのは、分散システムの動かせない天秤。
④ push か pull か — 誰が取りに行き、誰が押し込むか
- pushの宿命: 受信側が落ちていれば送信側が面倒を見るしかない → SNSの4フェーズ再試行(AWS管理エンドポイントは23日で100,015回)とDLQはこの帰結
- pullの利点: コンシューマが自分の処理速度でペースを握れる(バックプレッシャ)。だからSNS+SQSは『pushの即時性』と『pullのペース制御』を組み合わせる定番
- Kinesisだけが両刀: 共有スループット=GetRecordsによるpull、拡張ファンアウト=公式に『pushes the records to you over HTTP/2 using SubscribeToShard』。『同じログを何者が読むか』で経路を選べる
pullは受信側がペースを握り、pushは送信側が到達を保証しに行く。この違いから『SNSはなぜ再試行とDLQを持つか』『なぜSNS+SQSを重ねるか』『Kinesisはなぜ両方選べるか』が一本の原理で導ける。
⑤ 保存の性質 — 消えるキュー / 貯めないルーター / 消えないログ
- SQS=消費で確定して消す(処理はちょうど1者)。Kinesis=位置(カーソル)を進めるだけなので複数アプリが独立・同時に読める(公式: 「each application can consume data from the stream independently and concurrently」)
- SNS/EventBridgeは貯蔵しないから、配りきれない分の受け皿にDLQ(SQS)を付ける。EventBridge公式: 「An event bus is a router that receives events and delivers them to zero or more destinations, or targets」
- 既習との接続: KinesisはDynamoDB Streamsと同じ『追記ログ』の汎用版。リプレイ(過去に戻って読み直す)はログ構造の当然の帰結
保存の性質は『読んだあとどうなるか』で決まる。消えるキュー(SQS)・貯めないルーター(SNS/EventBridge)・消えない共有ログ(Kinesis)。この一点で『複数の読者が独立に進めたいならKinesis』『1タスク1処理者ならSQS』が即決まる。
⑥ 4軸マトリクス — 選択は暗記でなく導出になる
- 使い分けの導出例 — 1タスクを確実に1回処理したい: SQS(消えるキュー×pullでペース制御) / 1イベントを多数へ即ファンアウト: SNS or EventBridge(貯めないルーター×push) / 同じデータを複数系統が独立に集計・保管したい: Kinesis(非破壊の共有ログ) / 属性で宛先を仕分けたい: EventBridgeルール(内容ベースルーティング) or SNSフィルタポリシー
- EventBridgeのat-least-onceも再試行の裏返し: 配信失敗時は既定で24時間・最大185回まで指数バックオフ+ジッターで再試行し、使い切ると破棄(だからDLQを付ける)
- SNS(トピックを選んで発行)とEventBridge(1本に流してルールが仕分ける)はどちらもpush型の貯めないルーターだが、主役が『発行側のチャネル選択』か『受信側のルール』かで分かれる
- この表の各セルは①〜⑤で導いた原理の要約。だから丸暗記でなく『配信・順序・push/pull・保存』の4問に答えれば毎回このセルを再構成できる
4軸(配信保証・順序・push/pull・保存の性質)を縦の物差しにすると、4サービスの選択は暗記表でなく導出になる。既習の分散システム基礎(at-least-once・冪等性・順序スコープ・ポーリングvsプッシュ)がそのまま各列の答えになっているのが、この編全体の答え合わせ。