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' },
});
}
基礎から学ぶなら関連書籍が手がかりになる。
この記事は役に立ちましたか?
関連用語
Saga コレオグラフィ
各サービスがイベントを発行・購読し、中央のオーケストレーターなしで分散トランザクションを実現する方式
Step Functions
AWS のサーバーレスワークフローサービスで、Lambda 関数を視覚的に組み合わせてオーケストレーションする
イベント駆動アーキテクチャ
イベントの発行と購読を中心にシステムを構成し、サービス間の疎結合と非同期処理を実現するアーキテクチャスタイル
Aurora
AWS のクラウドネイティブ RDB で、MySQL/PostgreSQL 互換で高可用性・高パフォーマンスを実現する
X-Ray
AWS の分散トレーシングサービスで、リクエストの経路とレイテンシを可視化する
再帰
関数が自分自身を呼び出して問題を解く手法で、木構造やフラクタル的な問題に適する