Mímisbrunnr知恵の泉

← 分散システム 一覧

🎓 レベル:発展 | 重要度:A(必須)

📎 前提:2相コミット・3相コミット | 関連:冪等性と再試行・バックオフパーティショニング/シャーディング

要点(BLUF)

問題設定 ── サービスをまたいで一貫させたい

注文=「在庫を引く」「決済する」「配送を手配する」が別サービス(別DB、パーティショニング/シャーディング)にある。1つが失敗したら全体を取り消したい。だが2PCは全サービスをロックし、コーディネータ障害でブロックする(2相コミット・3相コミット)。マイクロサービスでは2PCの密結合・低可用性が嫌われます。

アルゴリズム ── Saga と補償

Sagaは各ステップを即コミットするローカルトランザクション T1…Tn に分け、各 Ti に補償 Ci(Ti を打ち消す逆操作)を用意します。失敗したら、それまでのステップを逆順に補償します。

sequenceDiagram
    participant O as 注文Saga
    participant I as 在庫
    participant P as 決済
    participant D as 配送
    O->>I: T1 在庫を引く(コミット)
    O->>P: T2 決済する(コミット)
    O->>D: T3 配送手配 -> 失敗!
    Note over O: 逆順に補償を実行
    O->>P: C2 返金(T2を打ち消す)
    O->>I: C1 在庫を戻す(T1を打ち消す)

実装は2系統:

正しさの観点 ── 何を保証し、何を諦めるか

他手法との比較

方式原子性分離性結合度/可用性向く場面
2PC(2相コミット・3相コミット強い強い密結合・低可用(ブロッキング)単一DB内・強整合必須
2PC+Raft化強い強い中・高可用強整合の分散DB(Spanner)
Saga結果整合的弱い(中間見える)疎結合・高可用マイクロサービス・長時間処理

なぜ分散だと難しいか(直観)

単一DBのトランザクションは ACID を無料でくれるが、サービス境界を越えた瞬間に原子性・分離性が高くつく。Sagaは「完全な原子性を諦め、補償で”だいたい元に戻す”」現実解。だが「元に戻せない操作(送信済みメール・出荷済み荷物)」があるので、補償は逆操作ではなく訂正アクションになる——ここに業務設計の難しさが宿ります。

⚠️ よくある誤解・落とし穴

対応ラボ

なし(概念回)。補償の前提となる冪等な再試行は 冪等性と再試行・バックオフ のラボで実証します。

関連

第7章 分散トランザクションと信頼性 目次