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