Saga パターン (オーケストレーション)
分散トランザクションを複数のローカルトランザクションに分割し、中央のオーケストレーターが制御するパターン
分散システムトランザクション
Saga オーケストレーションとは
Saga パターンのオーケストレーション方式は、中央のオーケストレーター (指揮者) が各サービスのローカルトランザクションを順番に呼び出し、失敗時には補償トランザクションを逆順に実行する方式である。AWS Step Functions が代表的なオーケストレーターだ。
処理の流れ
[Step Functions (オーケストレーター)]
1. 注文サービス: 注文作成 → 成功
2. 在庫サービス: 在庫引き当て → 成功
3. 決済サービス: 支払い処理 → 失敗!
4. 補償: 在庫サービス: 在庫を戻す
5. 補償: 注文サービス: 注文をキャンセル
コレオグラフィとの比較
| 観点 | オーケストレーション | コレオグラフィ |
|---|---|---|
| 制御 | 中央 (Step Functions) | 分散 (各サービスが自律) |
| 可視性 | 高い (フロー全体が可視化) | 低い (フローが見えにくい) |
| 結合度 | 中程度 (オーケストレーターに依存) | 低い (イベントのみ) |
| 複雑なフロー | 得意 (条件分岐、並列実行) | 苦手 |
| 適するケース | 5 ステップ以上の複雑なフロー | 3〜4 ステップの単純なフロー |
Step Functions の利点
- フロー全体が JSON/YAML で定義され、AWS コンソールで可視化される
- 各ステップのリトライ、タイムアウト、エラーハンドリングが宣言的に設定できる
- 実行履歴が自動的に記録され、デバッグが容易
- 並列実行 (
Parallelステート) や条件分岐 (Choiceステート) をサポート
補償トランザクションの設計
補償トランザクションはべき等に実装する。同じ補償が複数回実行されても安全であること。
// ❌ 非べき等: 2回実行すると在庫が2回戻る
async function releaseInventory(orderId: string) {
await db.inventory.increment(productId, quantity);
}
// ✅ べき等: 既に戻されていたら何もしない
async function releaseInventory(orderId: string) {
await db.inventory.update({
where: { orderId, status: 'reserved' },
data: { status: 'released' },
});
}
基礎から学ぶなら関連書籍が手がかりになる。