アウトボックス(Outbox)教材:22章 詳細アウトライン 📦📨✨
第1章:まず“事故”を知ろう(Outboxが必要な理由)😵💫💥
- ありがち事故①:DB更新OK、イベント送信NG → 送信漏れ📭
- ありがち事故②:送ったつもりが再送で 二重送信🔁
- ありがち事故③:順序が崩れて 状態がねじれる🌀
- ゴール🎯:Outboxが「何を守る技」かイメージする
第2章:Outboxを一言で(超ざっくり定義)🧠✨
- Outboxとは:“送る予定”をDBに安全に残す仕組み📦🧾
- ポイント:業務更新とOutbox記録を 同じトランザクション でやる🔐
- どんな時に使う?(通知・連携・非同期処理)📩🤝
第3章:前提① イベントってなに?(超入門)📨🙂
- 「イベント=起きた事実」って感覚(過去形が多い)✅
- Domain Event と Integration Event のざっくり違い👀
- 「どこまでがドメイン?どこからが外部?」の境界感🧱
第4章:前提② 非同期ってなに?(なんで必要?)⏱️🧩
- 同期(待つ) vs 非同期(待たない)のメリデメ⚖️
- 失敗や遅延がある世界で「壊れにくい」作り方🧯
- リトライ前提の現実を受け入れる心構え😇
第5章:前提③ 最終的整合性(“すぐ一致しない”を怖がらない)🕰️🌈
- 「今は違うけど、あとで揃う」って考え方⏳
- ユーザー体験と整合性の折り合い(どこは即時必須?)🎛️
- Outboxは最終的整合性の“安全装置”だよ🛡️
第6章:全体アーキ図を描こう(登場人物を整理)🗺️👥
- 登場:業務テーブル、Outboxテーブル、Publisher(送信係)📦📤
- 典型フロー:更新 → Outbox書く → 後で送る🔁
- “後で送る”の意味:送信処理の失敗を業務から切り離す✂️
第7章:ミニ題材を決める(学習用の小さな世界)🧪🍀
- お題例:注文確定 → 通知イベントを発行🛒📩
- 仕様を小さく固定(YAGNIでいくよ)🧊
- ゴール🎯:「動く最小」を最速で作る
第8章:Windows+VS Codeで開発準備(TypeScript最小構成)🪟💻
-
プロジェクトの構成(src / tests / scripts のイメージ)📁
-
実行・ビルド・テストの“いつもの流れ”を作る🔄
-
AI(Copilot/Codex)で雛形生成して時短する🤖✨
- 例:型定義のたたき台、DTOの雛形、フォルダ構成案
第9章:Outboxテーブル設計(まずは最小カラム)📦🧾
-
最小で必要になりがち:
- id(イベントID)🆔
- eventType(種類)🏷️
- payload(中身JSON)📄
- status(未送信/送信済み/失敗など)🚦
- createdAt(作成時刻)🕒
-
まずは“学習用に割り切る”ラインを決める🙂
第10章:payload設計のコツ(壊れにくいJSON)🧩📄
- 命名:イベント名・フィールド名のルールを決める📛
- 欠損値・null・単位(円?ドル?)の扱いを揃える🧷
- “受け側が困らない”payloadにする視点🎁
第11章:トランザクション入門(なぜOutboxとセット?)🔐🪄
- トランザクション=「まとめて成功 or まとめて失敗」✅❌
- Outboxの肝:業務更新+Outbox追加を同時にやる
- “ズレ”の例を図で理解(片方だけ成功が一番怖い)😱
第12章:実装① 書き込み(業務更新+Outbox追加)🛠️✅
-
アプリ層の責務:入力→ユースケース実行→結果返す🎯
-
ドメイン層の責務:ルールと状態を守る🧠
-
インフラ層の責務:DB保存とOutbox保存📦
-
AIに「責務分離レビュー」をさせる👀🤖
- 例:DBアクセスがドメインに混ざってない?など
第13章:Publisher入門(まずは“疑似送信”でOK)📤🙂
- 未送信のOutboxを拾って処理する(ポーリング)⏱️
- 送信先は最初ダミーでOK(コンソール出力でも学べる)📢
- 送信成功 → status更新✅
第14章:並行実行とロック(複数ワーカー問題)👯♀️🔒
-
2つのPublisherが同じレコードを拾うと…二重送信😵
-
対策の考え方:
- “先に確保(lock)してから処理”のイメージ🧲
- status遷移(processing → sent/failed)🚦
-
学習用に「簡易ロック」→「実運用寄り」へ段階を作る階段設計🪜
第15章:リトライ基本(どこで、何回、いつ?)🔁🧠
-
リトライ回数・間隔・例外の分類を決める🎛️
-
失敗は3種類に分けると楽:
- 一時的(ネットワーク)🌧️
- 恒久的(データ不正)🧱
- 仕様上(禁止状態)🚫
-
AIに「失敗パターンの洗い出し」を手伝わせる🤖📝
第16章:バックオフ&スケジューリング(賢い再送)⏳📈
- 連打は迷惑&コスト💸 → 間隔を伸ばす(指数バックオフ)📈
- nextRetryAt の設計アイデア🕒
- “再送待ち”を見える化する(運用で助かる)👀
第17章:冪等性(同じのが2回来ても壊れない)🛡️🔁
- Outboxでも二重送信は“起こり得る”前提😇
- 冪等キー(idempotency key)の作り方・持たせ方🔑
- “受け側”でも守ると最強(重複排除)💪
第18章:順序(Ordering)をどう扱う?🍱➡️🍱
- 順序が大事なイベント・大事じゃないイベントを分ける⚖️
- 同じ注文IDのイベントは順序維持したい、みたいな話📦
- “全部に順序保証”は重いので、範囲を絞るのがコツ🙂
第19章:Dead Letter(失敗を隔離して人が直せるように)📮😢➡️🙂
- 何回やっても無理なものは隔離(DLQ/DeadLetter)🗃️
- “直せる情報”を残す:理由・入力・回数・最終例外など🧾
- 運用の現場で泣かない設計🥹🫶
第20章:契約とバージョン(イベントは将来も残る)🧬🏷️
-
payloadに schemaVersion を持たせる案📄
-
後方互換の基本:
- 追加は比較的安全✅
- 削除・意味変更は危険⚠️
-
破壊変更の“段階的廃止”の進め方🛠️
-
(ここで “契約設計” の考え方をやさしく固めるよ😊)
第21章:観測できるOutbox(ログ・メトリクス・追跡)🔍📊✨
- ログ:相関ID、イベントID、失敗理由、処理時間📝
- メトリクス:未送信件数、遅延、失敗率、リトライ回数📈
- 「困った時に原因へ辿り着ける設計」を最初から入れる🧯
- AIに「観測項目の抜け漏れチェック」させる🤖✅
第22章:総合演習ミニプロジェクト(段階クリア方式)🎓🎉
-
22-A 最低限:Outboxが動く(書く→拾う→送る)✅
-
22-B 発展:ロック・リトライ・バックオフ・DLQを追加🚀
-
22-C 仕上げ:冪等性&順序&観測で“実戦っぽく”🛡️📊
-
22-D AIレビュー会:
- 設計の責務分離(SoC)できてる?✂️
- 例外境界(エラーモデリング)暴れてない?🚦
- 将来の変更に耐える?(KISS/YAGNIとのバランス)⚖️
毎章で使える「AI活用ミニ型」🤖✨(教材に組み込みやすいよ)
- 雛形:型定義・DTO・フォルダ構成案を出してもらう📁
- レビュー:責務混在・依存の向き・例外の漏れを指摘してもらう👀
- テスト案:失敗ケースを増やしてもらう(送信失敗、二重、順序崩れ)🧪
- 命名:eventTypeやpayloadの名前を相談して揃える📛