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