【さがぱたーん】

Sagaパターン とは?

最終更新:
💡 分けて進め、失敗したら「取り消しの仕事」で整える

Sagaパターンは、複数サービスの処理をローカルトランザクションに分け、失敗時は業務上の補償処理で整合させる方法です。予約の取り消し例、DBのロールバックとの違い、実行方式と再試行の注意点を説明します。

📌 このページのポイント
失敗したら、取り消しの仕事注文処理の例:各サービスで確定注文作成済み✓在庫予約済み✓決済失敗×在庫予約解除注文キャンセルこの例での補償の流れ補償 = 業務上の取り消し処理失敗や再試行も記録して管理
注文・在庫の処理は確定済みで、補償は別の処理として行います。図は一例であり、補償の順番や取り消せる範囲は業務のルールによります。
ひよこ ひよこ
サービスごとにDBがあると、まとめて取り消せないの?
ペンギン先生 ペンギン先生
一つのDBで行うトランザクションのように、すべてを同時に確定・取り消しできるとは限らないよ。Sagaでは注文作成、在庫予約、決済などをそれぞれ確定し、途中で続けられなくなったときの補償処理を用意する。分散トランザクションには別の方法もあり、Sagaだけが選択肢ではないんだ。
ひよこ ひよこ
補償処理は、DBのロールバックと同じ?
ペンギン先生 ペンギン先生
違うよ。確定済みの処理に対して、在庫予約を解除する、注文をキャンセルする、返金する、といった業務上の処理を追加する。ほかの利用者の変更もあるので、単に昔のデータへ戻してはいけない。取り消しの条件や返金額なども、業務のルールに合わせるんだ。
ひよこ ひよこ
誰が次の処理を決めるの?
ペンギン先生 ペンギン先生
コレオグラフィでは、各サービスがイベントを受けて次の仕事を進める。オーケストレーションでは、調整役が順序や状態を管理して指示するよ。前者は全体の流れを追うこと、後者は調整役への依存などに注意する。サービスの個数だけで方式を決めるものではないね。
ひよこ ひよこ
途中では、全部そろっていない状態になる?
ペンギン先生 ペンギン先生
なることがあるよ。たとえば在庫は予約済みでも、決済はまだ完了していない。サービスをまたぐ処理の途中をどう見せるか、ほかの注文と競合したらどう扱うかを設計する。Saga自体が、通常のトランザクションと同じ分離性を自動で提供するわけではないんだ。
ひよこ ひよこ
取り消しが失敗したらどうするの?
ペンギン先生 ペンギン先生
補償も失敗することがあるので、進み具合を記録し、再試行や通知・人の確認を用意するよ。同じ処理を繰り返しても二重の返金などが起きないよう、冪等性も考える。補償の順番は業務によって異なり、取り消せない処理には別の扱いが必要だね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Sagaパターン」って出てきたら「分けた処理を、失敗時の取り消しの仕事も含めて進める方法」と思えばだいたいOK!
📖 おまけ:英語の意味
「Saga Pattern」 = 一連の処理を扱うSagaパターン
💬 Sagaは長い物語を表す言葉。システムでは、複数のローカルトランザクションをつないで進め、必要な補償も含めて扱うパターンの名前だよ。

参考資料

← 用語集にもどる