2PC против Sagas (распределенные транзакции)

Я развиваю свое понимание распределенных систем и как поддерживать согласованность данных в таких системах, где бизнес-транзакции охватывают множество сервисов, ограниченные контексты и границы сети.

Вот два метода, которые, как я знаю, используются для реализации распределенных транзакций:

  • 2-фазный фиксатор (2PC)
  • Саги

2PC - это протокол для приложений, позволяющих прозрачно использовать глобальные транзакции ACID при поддержке платформы. Насколько я знаю, он встроен в платформу, он прозрачен для бизнес-логики и кода приложения.

С другой стороны, Sagas представляют собой серию локальных транзакций, где каждая локальная транзакция мутирует и сохраняет сущности вместе с некоторым флагом, обозначающим фазу глобальной транзакции, и фиксирует изменение. Другими словами, состояние транзакции является частью модели домена. Откат - это вопрос совершения серии "перевернутых" транзакций. События, испускаемые службами, запускают эти локальные транзакции в любом случае.

Теперь, когда и зачем использовать саги над 2PC и наоборот? Каковы варианты использования и плюсы/минусы обоих? В частности, хрупкость саг заставляет меня нервничать, так как перевернутая распределенная транзакция может потерпеть неудачу.

Ответ 1

В моем понимании (не большой пользователь 2PC, так как считаю его ограничивающим):

  • Как правило, 2PC для немедленных транзакций.
  • Как правило, Sagas для длительных транзакций.

После этого случаи использования очевидны:

  • 2PC может позволить вам совершить всю транзакцию в запросе или так, охватывая этот запрос в разных системах и сетях. Предполагая, что каждая участвующая система и сеть следуют протоколу, вы можете совершать или откатывать всю транзакцию без проблем.
  • Saga позволяет разделить транзакцию на несколько этапов, охватывая длительные периоды времени (не обязательно системы и сети).

Пример:

  • 2PC: сохранение клиента для каждого полученного запроса счета, в то время как оба управляются двумя различными системами.
  • Сагас: закажите маршрут полета, состоящий из нескольких стыковочных рейсов, в то время как каждый отдельный рейс управляется различными авиакомпаниями.

Я лично считаю сагу способной делать то, что может сделать 2PC. Противоположно не точно.

Я думаю, что Sagas универсальны, а 2PC включает блокировку платформы/поставщика.