アウトボックス(Outbox)教育コンテンツ:22章 詳細アウトライン 📚✨
第1章:まず「Outboxって何のため?」を超ざっくり掴む 😺📦
- 今日のゴール:DB更新と通知送信のズレをなくすイメージを持つ✨
- ありがちな事故(例:注文は保存されたのにメールは飛ばない)😱
- 「Outbox=あとで送るための“発送待ち箱”」という比喩📮
第2章:なぜズレるの?二重書き込み(Dual Write)の怖さ 😵💫🧨
- DB保存と送信(HTTP/Queue)が“別世界”な理由🌍
- 失敗パターン表(DB成功・送信失敗/逆/タイムアウト…)⛈️
- “成功したと思ったのに実は失敗”が起きる理由🌀
第3章:開発環境セットアップ(Windows)🪟🧰
- Visual Studio での作り方(ソリューション、プロジェクト)🧩
- Visual Studio Code でもできる構成(必要なら)⌨️
- 2026想定の .NET / C# でプロジェクト開始まで🏁
第4章:AI(Copilot/Codex系)を“安全に使う”流れ 🤖✅
- 何をAIに頼む?(雛形・テスト案・例外パターン洗い出し)✨
- 何は人間が必ず見る?(トランザクション範囲、再試行、冪等性)👀
- レビュー用チェックリスト(この教材で毎回使う)📝
- ※組織名:GitHub / OpenAI / Microsoft(利用環境の前提として1回だけ登場)
第5章:トランザクション超入門(“全部成功 or 全部失敗”)🔒🍙
- コミット/ロールバックの感覚をつかむ🎮
- 「同じトランザクションに入れる」ってどういうこと?🧠
- やらかし例:トランザクションが短すぎ/長すぎ問題😅
第6章:イベントとメッセージの超入門 📩✨
- 「イベント(起きた事実)」と「命令(して)」の違い🗣️
- “通知”はだいたいメッセージとして飛ぶ📨
- 送信先(キュー/イベント基盤/HTTP)のイメージだけ持つ🎯
第7章:Outboxパターンの全体像(登場人物紹介)🗺️👥
- 主役:業務テーブル、Outboxテーブル、配送係(Relay)🚚
- 流れ:①業務更新+Outbox記録(同じトランザクション)→②後で配送📦➡️📩
- 何が嬉しい?:ズレが起きにくい🛡️
第8章:いつ使う?いつ使わない?判断のコツ 👀🌱
- 使う:他サービス連携、非同期通知、リトライ前提の世界🌩️
- 使わない:単純な単一アプリ内で完結、送信不要🙅♀️
- “小さく導入”の境界線(初心者が迷わない基準)📏
第9章:Outboxテーブル設計(ミニマム版)📦🧱
- 最小セット:Id / Type / Payload / OccurredAt 🧾
- Statusは必要?(最初は“未送信/送信済”だけでもOK)✅
- 演習:DBにOutboxテーブルだけ作って眺める👀
第10章:Outboxテーブル設計(運用を見据えた版)🔍🧹
- Status(Pending/Sent/Failed)、RetryCount、LastError…💥
- 取り出し用インデックス(“未送信を素早く探す”)🏃♀️
- 保持期間(古いOutboxを掃除する)🧹
- “後で地獄”にならない設計のコツ🔥
第11章:書き込み側の設計(責務分離の形)🧠🧩
- 「業務処理」と「Outboxに積む」を混ぜない(SoC)🍱
- “イベントを作る場所”を決める(ユースケース層?ドメイン?)📌
- まずはシンプルに:アプリ層でOutbox record生成📝
第12章:書き込み側の実装(C# + DB更新+Outbox追加)✍️🔒
- 同一トランザクションで2つ書く(ここが本丸)👑
- 例外時の動き:途中で落ちたらどうなる?🧯
- AIに雛形を出させる→人が“トランザクション範囲”を最終確定🤖✅
- ミニ演習:注文作成(Orders)+Outbox追加を1回動かす🛒
第13章:Payload(中身)設計:JSON化とサイズ感 🧾📏
- Payloadに何を入れる?(必要最小限が正義)👼
- 個人情報を詰めすぎない(運用・セキュリティ的にも)🙈
- “参照IDだけ送る”設計の考え方🔗
- ミニ演習:PayloadをJSONで保存して読めることを確認👀
第14章:契約(バージョン)をちょい意識する 🏷️🔁
- 将来、Payloadの形は変わる(絶対変わる)😇
- Versionフィールド or Type名にv1/v2を付ける案📌
- “壊さず進化”のミニルール(初心者版)🧡
第15章:配送係(Relay)の設計:まずはポーリングでOK ⏱️🚚
- ポーリングとは?(一定間隔で未送信を取りに行く)⏰
- 1回に何件?(バッチサイズ)📦📦📦
- 送信の順序をどう扱う?(最初は気にしすぎない)🙂
第16章:配送係(Relay)の実装:Worker/BackgroundService 🧑💻🔧
- Windows上で動かす「常駐の小さな配送アプリ」🪟
- ループ、待機、キャンセル(停止)の基本🛑
- “二重起動”が起きると何が困る?👯
第17章:送信先アダプタ設計(DIP/DIの練習)🔌🧩
- IEventPublisherみたいなインターフェースを切る✂️
- 実装1:まずは“偽ブローカー”(コンソール出力)🖥️
- 実装2:HTTP送信などに差し替えできる形にする🔁
- DI(コンストラクタ注入)で差し替え練習🧃
第18章:到達保証の話(Outboxはだいたい“At-least-once”)📬🔁
- “最低1回は送る”=重複が起き得る😅
- 「送れたかどうか」は意外と曖昧問題🤷♀️
- ここで次章の冪等性へつなぐ🧠✨
第19章:冪等性(考え方編)🧷🧠
- 「2回届いても1回分として扱う」って何?🔁➡️1️⃣
- Idempotency Keyの考え方(OutboxIdを使うのが定番)🪪
- “送り手”だけでなく“受け手”が守るのが基本🤝
第20章:冪等性(実装編):受け手側の重複排除 ✅🛡️
- 方法A:処理済みテーブル(Inbox的なもの)📥
- 方法B:ユニーク制約で二重登録を弾く🧱
- ミニ演習:同じメッセージを2回処理しても結果が1回になるのを確認🎯
第21章:リトライ設計+デッドレター(失敗と仲良くなる)🛠️🧯
- 一時失敗(ネットワーク) vs 恒久失敗(不正データ)🌩️🧱
- リトライ回数、間隔、バックオフ(だんだん待つ)⏳
- “毒メッセージ”は隔離(Dead Letter相当)☠️➡️📦
- 運用のミニ手順:隔離したら何を見る?どう直す?🔍
第22章:観測&テスト&ミニ演習まとめ(ここで完成!)📈🧪🏁
-
観測:未送信数、滞留時間、失敗率、LastErrorを見る👀📊
-
ログの最低限(相関ID、OutboxId、例外理由)🧵
-
テスト戦略
- 単体:Outboxレコード生成の正しさ🧪
- 統合:DB更新+Outbox追加が同時に成功する🔒
- 失敗注入:送信失敗→リトライ→成功🎭
-
最終ミニ演習:
- 「注文作成→Outbox→Relay→送信(偽ブローカー)→受け手で冪等」まで通す🛒📦🚚📩✅
-
次の一歩:最終的整合性、Saga、観測強化へ🧭✨