中級ではメッセージングと配信保証を見ました。上級では、キュー型 vs ログ型・順序・整合へ。
概要 — まず全体をつかむ
詳細 — 1段階ずつ追う
キュー型とログ型
- キュー型(RabbitMQ・SQS)— 取り出したら消える。ワーカーで分担
- ログ型(Kafka)— 追記されたログを各コンシューマが自分のオフセットで読む。再処理しやすい
- パーティション — 並列度の単位。同一パーティション内でのみ順序保証
やさしく言うと(中級)
非同期は「送る側・仲介・受ける側」の3者で成り立ちます。
- プロデューサ — 仕事(メッセージ)を積む側
- ブローカー — キューを預かる仲介(RabbitMQ・SQS・Kafka など)
- コンシューマ(ワーカー) — 取り出して処理する側
登場人物メモ:
- ※1 ack(確認応答) — 「処理し終えた」をブローカーに返す。ackするまで消えない
- ※2 冪等性 — 同じメッセージを複数回処理しても結果が同じ
流れと保証
- プロデューサが永続化+レプリカされたブローカーへ送る
- コンシューマグループが分担して読む(各パーティション1消費者)
- 処理後にack/オフセットコミット
- 失敗は再配信、繰り返す失敗はDLQへ
やさしく言うと(中級)
- プロデューサがメッセージを enqueue(積む)
- ブローカーがキューで保持
- ワーカーが dequeue して処理
- 成功したら ack。失敗なら再配信(リトライ)
- 何度も失敗するものは デッドレターキュー へ退避
アニメーション『メッセージキュー』を開く
1件の仕事が「投入 → 取り出し → 実行 → 完了通知(ack)」をたどる流れは、次のアニメで1手ずつ追えます。
アニメーション『非同期処理(キュー→ワーカー)』を開く
- プロデューサ — 仕事(メッセージ)を積む側。積んだら即解放され、処理の完了は待たない
- キュー — 仕事を順に預かる箱の列。ackされるまでメッセージを消さずに保持する
- ワーカー — 取り出して実処理する側。自分のペースで進め、混雑時は台数を増やせる
0 / 4
整合性の作り方
- exactly-onceの実像 — at-least-once+冪等、またはトランザクショナルな読み書き
- トランザクショナルoutbox — DB更新とイベント発行を取りこぼさず一致
- スキーマレジストリ — メッセージ形式の進化を管理(後方互換)
- 順序と並列 — 順序を厳しくすると並列度が下がる。キー設計で両立を探る
やさしく言うと(中級)
- 配信保証 — at-least-once(重複しうる)/at-most-once(取りこぼしうる)。多くはat-least-once+冪等
- 順序 — 厳密な順序保証はコストが高い。必要な範囲だけに絞る
- スケール — ワーカーを増やして並列処理(水平スケール)
- 優先度・遅延 — 緊急ジョブを先に、指定時刻に実行、なども
- 可視性タイムアウト(visibility timeout) — 取り出したメッセージは一時的に他ワーカーから隠れ、ack前に時間切れになると再出現する(重複配信の実際の発生源)
⚠️ 深部の落とし穴
- リバランスの停止 — コンシューマ増減時に一時停止・重複
- オフセットのずれ — コミット漏れで重複、先行コミットで欠落
- ホットパーティション — 特定キーに集中して詰まる
- ポイズンメッセージ — 壊れたメッセージが再処理を止める(DLQ)
やさしく言うと(中級)
- 重複配信 — at-least-onceゆえ。冪等にして二重実行を無害化する
- 順序の乱れ — 並列処理で前後する
- バックプレッシャ(詰まり) — 積む速度>処理速度で溜まり続ける
- ポイズンメッセージ — 壊れたジョブが無限リトライ。DLQで隔離する
理解度チェック
そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。
問1. ログ型(Kafkaなど)で順序が保証される単位は?
問2. 「厳密に1回だけ処理」を現実に近づける、実務の組み合わせは?
問3. キュー型とログ型の違いとして正しいのはどれか?
問4. 繰り返し失敗する・壊れたメッセージを隔離して溜めておく先はどれか?
問5. 「ホットパーティション」が指す状態はどれか?
問6. オフセットの「コミット漏れ」で起きやすいのはどれか?
問7. DB更新とイベント発行を取りこぼさず一致させる、本文が挙げるパターンを答えてください。
問8. メッセージ形式(スキーマ)の進化を後方互換に管理する仕組みを本文の呼び名で答えてください。