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' },
  });
}

基礎から学ぶなら関連書籍が手がかりになる。

関連用語