2PC против Sagas (распределенные транзакции)
Я развиваю свое понимание распределенных систем и как поддерживать согласованность данных в таких системах, где бизнес-транзакции охватывают множество сервисов, ограниченные контексты и границы сети.
Вот два метода, которые, как я знаю, используются для реализации распределенных транзакций:
- 2-фазный фиксатор (2PC)
- Саги
2PC - это протокол для приложений, позволяющих прозрачно использовать глобальные транзакции ACID при поддержке платформы. Насколько я знаю, он встроен в платформу, он прозрачен для бизнес-логики и кода приложения.
С другой стороны, Sagas представляют собой серию локальных транзакций, где каждая локальная транзакция мутирует и сохраняет сущности вместе с некоторым флагом, обозначающим фазу глобальной транзакции, и фиксирует изменение. Другими словами, состояние транзакции является частью модели домена. Откат - это вопрос совершения серии "перевернутых" транзакций. События, испускаемые службами, запускают эти локальные транзакции в любом случае.
Теперь, когда и зачем использовать саги над 2PC и наоборот? Каковы варианты использования и плюсы/минусы обоих? В частности, хрупкость саг заставляет меня нервничать, так как перевернутая распределенная транзакция может потерпеть неудачу.
Ответы
Ответ 1
В моем понимании (не большой пользователь 2PC, так как считаю его ограничивающим):
- Как правило, 2PC для немедленных транзакций.
- Как правило, Sagas для длительных транзакций.
После этого случаи использования очевидны:
- 2PC может позволить вам совершить всю транзакцию в запросе или так, охватывая этот запрос в разных системах и сетях. Предполагая, что каждая участвующая система и сеть следуют протоколу, вы можете совершать или откатывать всю транзакцию без проблем.
- Saga позволяет разделить транзакцию на несколько этапов, охватывая длительные периоды времени (не обязательно системы и сети).
Пример:
- 2PC: сохранение клиента для каждого полученного запроса счета, в то время как оба управляются двумя различными системами.
- Сагас: закажите маршрут полета, состоящий из нескольких стыковочных рейсов, в то время как каждый отдельный рейс управляется различными авиакомпаниями.
Я лично считаю сагу способной делать то, что может сделать 2PC. Противоположно не точно.
Я думаю, что Sagas универсальны, а 2PC включает блокировку платформы/поставщика.