web-dev-qa-db-ja.com

2PC対Sagas(分散トランザクション)

ビジネストランザクションが複数のサービス、境界のあるコンテキスト、ネットワークの境界をカバーする分散システム、およびそのようなシステム全体でデータの一貫性を維持する方法についての洞察を発展させています。

分散トランザクションの実装に使用されることがわかっている2つのアプローチを次に示します。

  • 2フェーズコミット(2PC)
  • サガ

2PCは、アプリケーションがtransparentlyプラットフォームのサポートによりグローバルACIDトランザクションを利用するためのプロトコルです。プラットフォームに組み込まれているため、私が知る限り、ビジネスロジックとアプリケーションコードに対して透過的です。

一方、Sagasは一連のローカルトランザクションであり、各ローカルトランザクションは、グローバルトランザクションのフェーズを示すフラグとともにエンティティを変更および永続化し、変更をコミットします。つまり、トランザクションの状態はドメインモデルの一部です。ロールバックとは、一連の「反転した」トランザクションをコミットすることです。いずれの場合でも、サービスによって発行されたイベントがこれらのローカルトランザクションをトリガーします。

さて、2PCでsagasを使用するのはいつ、そしてなぜですか?両方のユースケースと賛否両論は何ですか?特に、倒立分散トランザクションも失敗する可能性があるため、sagaの脆弱性は私を緊張させます。

21
Tuomas Toivonen

私の理解では(2PCを制限していると考えているため、2PCの大ユーザーではありません):

  • 通常、2PCはimmediateトランザクション用です。
  • 通常、Sagasはlong runningトランザクション用です。

ユースケースはその後明らかになります:

  • 2PCを使用すると、要求全体でトランザクション全体をコミットすることができ、この要求をシステムやネットワーク全体に広げることができます。参加している各システムとネットワークがプロトコルに従っていると仮定すると、トランザクション全体をシームレスにコミットまたはロールバックできます。
  • Sagaを使用すると、トランザクションを複数のステップに分割し、長期間に及ぶことができます(必ずしもシステムやネットワークではありません)。

例:

  • 2PC:受信した請求書リクエストごとに顧客を保存します。両方とも2つの異なるシステムによって管理されます。
  • Sagas:複数の接続便で構成されるフライト旅程を予約しますが、個々の便は異なる航空会社によって運営されています。

私は個人的に、佐賀が2PCでできることをできると考えています。反対は正確ではありません。

Sagasは普遍的であり、2PCはプラットフォーム/ベンダーのロックダウンを伴うと思います。

14
Tengiz