【さがぱたーん】

Sagaパターン とは?

💡 失敗したら巻き戻す、分散システム版の「元に戻す」ボタン
📌 このページのポイント
Sagaパターン(オーケストレーション方式) Sagaオーケストレーター 正常フロー 1. 注文作成 注文サービス 2. 在庫引当 在庫サービス 3. 決済処理 決済サービス 完了! 失敗時の補償フロー 1. 注文作成 2. 在庫引当 3. 決済失敗 ✗ エラー ← 在庫戻し(補償) ← 注文取消(補償) 補償 = 逆操作で 巻き戻す処理 失敗したら逆順に補償トランザクションを実行して整合性を保つ
Sagaパターンによる分散トランザクションと補償処理のイメージ
ひよこ ひよこ

普通のトランザクションじゃダメなの?

ペンギン先生 ペンギン先生

1つのデータベースなら普通のトランザクションでいいんだけど、マイクロサービスだと注文・在庫・決済がそれぞれ別のDBを持ってる。複数DBをまたいだロールバックができないんだ

ひよこ ひよこ

補償トランザクションって具体的にどうやるの?

ペンギン先生 ペンギン先生

例えば「注文確定→在庫引当→決済」の流れで決済が失敗したら、「在庫戻し→注文キャンセル」を逆順に実行する。各サービスが「やり直し用の処理」を持っておくんだよ

ひよこ ひよこ

コレオグラフィとオーケストレーション、どっちがいいの?

ペンギン先生 ペンギン先生

サービス数が少ないならイベント駆動のコレオグラフィがシンプル。5つ以上のサービスが絡むならオーケストレーター(指揮者)を置いた方が流れを追いやすいね

ひよこ ひよこ

一時的にデータがおかしくなるのって大丈夫なの?

ペンギン先生 ペンギン先生

そこが設計の腕の見せどころだね。注文ステータスを「処理中」にしておいてユーザーに見せるとか、セマンティックロックという技法で不整合を隠す工夫が大事だよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Sagaパターン」って出てきたら「失敗したら補償処理で巻き戻す分散トランザクション」と思えればだいたいOK!
📖 おまけ:英語の意味
「Saga Pattern」 = 物語パターン
💬 1987年にHector Garcia-MolinaとKenneth Salemが論文で提唱。長い物語(Saga)のように、一連のステップが順番に進んでいく様子が名前の由来だよ
← 用語集にもどる