注文・在庫・決済・配送を 1 つのアプリケーション(モジュラーモノリス)として動かし、データベースは 1 つに保つ。コンテキストをまたぐ処理は、注文のトランザクションで記録したイベントをキュー経由でワーカーが進める。
サービス分割は見送る。チームは 1 つで、デプロイの独立性より、在庫引当と注文確定を同じトランザクションで扱えることを優先する。
モジュール同士は公開インターフェースだけを呼び、他のモジュールのテーブルを直接読まない。依存は注文から他へ向かう一方向に揃え、逆向きの連絡はイベントで返す。
状態の更新とイベントの記録は同じトランザクションで行い(outbox)、キューへの送信は relay に任せる。配送は at-least-once なので、ジョブはすべて冪等に作る。
| 層 | 構成 | スケール |
|---|---|---|
| リージョン | 東京リージョン(ap-northeast-1)、2 AZ | 大阪へは DB のスナップショットだけを複製 |
| App (API) | ECS on Fargate、各 AZ に最低 2 タスク | CPU 60% でスケールアウト、上限 20 タスク |
| Worker / relay | API と同じイメージを別の ECS サービスで起動 | キューの滞留数でスケール、relay は 1 タスク固定 |
| Aurora PostgreSQL | Multi-AZ、リーダーインスタンス 1 | Backoffice の一覧と集計はリーダーから読む |
| SQS | 標準キュー + DLQ | — |
| 項目 | 目標 | 備考 |
|---|---|---|
| 可用性 | 注文確定 API 99.9% / 月 | 決済代行の障害は含めない |
| 応答時間 | 注文確定 p95 800ms、キャンセル受付 p95 300ms | キャンセルは返金を待たずに 202 を返す |
| ピーク | セール時 300 注文 / 分 | 在庫引当の行ロック待ちを監視する |
| 復旧 | RPO 5 分、RTO 1 時間 | ポイントインタイムリカバリ |
| 整合性 | 支払済みの注文は必ず出荷指示か返金に到達する | 30 分以上どちらにも進まない注文を検知する |