第01章:まず「Outboxって何のため?」を超ざっくり掴む 😺📦
今日のゴール 🎯✨
この章のゴールはたったこれだけです👇 **「DBの更新」と「外への通知(メール・キュー・HTTPなど)」がズレて事故るのを防ぐために、Outboxを使うんだな〜**ってイメージを持つこと💡
まず最初に:よくある事故ストーリー 😱📩
事故A:注文は保存されたのに、メールが飛ばない 🛒✅→📧❌
たとえばネットショップで…
- 注文をDBに保存する(成功)✅
- 「注文ありがとうメール」を送る(失敗)❌(ネットワーク不調・メールサービス落ち・タイムアウト…)
結果:
- お客さん「買ったのにメール来ない…不安😢」
- 運営「DB見たら注文ある!でもメール送れてない!どこまで処理したっけ?😵💫」
事故B:メールは飛んだのに、注文が保存されてない 📧✅→🛒❌
逆もあります…(これ、もっと怖い😇) 「注文確認メールが来たのに、注文が存在しない」みたいな世界線が爆誕します💥
なんでズレるの?ざっくり理由 🌍🌀

ポイントはここ👇 **DBに書くのと、外の世界に通知するのは“別の場所・別の仕組み”**だからです。
- DB更新:同じDBの中ならトランザクションで守れる🔒
- 外への送信:ネットワーク越し・別サービス・別サーバー…失敗しうる🌩️
この「別々のものを、両方まとめて成功させたい」問題を、一般に Dual Write(2重書き込み)問題 と呼びます💣 たとえば「DB更新」と「メッセージングシステムへの書き込み」を“原子的に(全部成功 or 全部失敗で)”やりたいのに、それが難しくて不整合が起きる…という説明がされています。(Confluent)
Outboxって何?ひとことで 🍙📦
**Outboxは「あとで送るための“発送待ち箱”」**です📮✨
「今すぐ外に送る」のをやめて、いったんこうします👇
- ① まず DBの中に「送る予定のメッセージ」を保存する(Outboxテーブルなど)🧾
- ② あとで別の仕組み(配送係)がそれを読んで送る🚚📩
そして超大事なのがここ👑 業務データの更新(例:注文テーブル)と、Outboxへの記録を“同じDBトランザクション”で一緒にやることです🔒✨ これにより「注文はあるのに通知がない」みたいなズレを起こしにくくします🛡️ この考え方は「Transactional Outbox(トランザクション送信トレイ)」として、信頼できるメッセージングや確実な配信を支える方法として説明されています。(Microsoft Learn)
図でつかむ:Outboxなし vs Outboxあり 🧠🖼️
Outboxなし(事故りやすい)😵💫
[アプリ]
├─ DBに保存 ✅
└─ 外へ送信 ❌(落ちることがある)
↓
ズレ発生 😱
Outboxあり(ズレを減らす)😺📦
[アプリ]
└─ (同一トランザクション)
├─ DBに保存 ✅
└─ Outboxに「送るもの」を保存 ✅
↓(あとで)
[配送係] がOutboxを読んで外へ送信 🚚📩
Outboxがくれる嬉しさ 3つ 🌟🌟🌟
1) 「DB更新は成功したのに通知失敗」の混乱が減る 🧹✨
通知が失敗しても、Outboxに“送るべき記録”が残るので、あとでリトライできる土台ができます🔁
2) “どこまで処理した?”が追える 🔍
Outboxが「発送待ちリスト」になるので、未送信が見える化👀📦 (第22章の観測にもつながるやつ!)
3) 現実的な信頼性に寄せられる 🤝
分散システムでは「外への送信」は失敗が前提になりがちなので、パターンとして整理しておくのが強いです💪 (このへんは後半で「At-least-once」「冪等性」につながるよ🧷✨)
ここでミニ演習 📝💡(手を動かさなくてOK!)
あなたが作ったことがありそうな機能を1つ思い浮かべてください👇(例:会員登録、注文作成、予約確定…)
そして、次の3つを埋めてみてね☺️✍️
- DBに保存するもの:例)Ordersに1レコード
- 外へ通知したいこと:例)「注文確定しました」メール
- 通知が失敗したら困ること:例)問い合わせ増える、二重注文の疑い、手動対応地獄😇
これが埋まったら、もうOutboxの必要性の入口に立ててます🙆♀️✨
よくある勘違いを先につぶす 🙅♀️💥
- 「Outboxって、送信を絶対成功させる魔法?」 → ちがうよ〜!Outboxは「ズレを減らして、失敗しても立て直せる形」にする仕組み📦🛠️
- 「Outboxを書いたら即送信しなくていいの?」 → 送信はする!でも役割を分けるのが大事。 「書く人」と「送る人」を分けるイメージ👥🚚
この章のまとめ 🍀📌
- DB更新と外部送信を別々にやると、失敗でズレて事故る😱
- それが Dual Write 問題で、分散・外部連携では起こりやすい💣(Confluent)
- Outboxは「発送待ち箱」📦
- DB更新とOutbox記録を同じトランザクションで行い、あとで配送係が送る🚚📩(Microsoft Learn)
次の章では、「なんでそんなにズレるのか」をもうちょい具体的な失敗パターンで見ていきます😵💫🧨