SAGA
Зачем
Паттерн для Распределенных транзаций
- последовательность транзакций, которые обновляют каждую службу
- и публикуют сообщение или событие для активации следующего шага транзакции
- Если шаг завершается ошибкой, SAGA выполняет компенсирующие действия транзакции, которые противодействуют предыдущим локальным транзакциям
- Паттерн обеспечения согласованности(консистентности) данных при распределенных (бизнес) транзакциях, решает проблемы производительности Long Lived Trasactioin (LLT).
- Решения по обеспечению надёжности (констистентности) транзакций, стали востребованы в микросервисной архитектуре MSA
- SAGA состоит из действий (actions) направленных на обеспечение консистентности транзакций и является при этом неатомарной единицей (unit) консистентности
- При реализации SAGA особое внимание нужно уделять уровням изоляции
Транзакция (договор) - механизм сохранения консистентности данных при нескольких логически связанных последовательных изменениях состояния. Должна быть выполнена только полностью. Транзакции должны быть атомарными, согласованными, изолированными и устойчивыми (ACID).
TODO
- Хореографии или Оркестрации
- Backward recovery
- Forward recovery
Плюсы-минусы
Плюсы:
- децентрализованный подход, не использует центральный контроллер
- Чтобы отказаться от Two phase commit в распределенной среде - плохо масштабируемый алгоритм
Минусы:
- Сложность
- Распределенная транзакция - зло, необходимо избегать разделяя правильно на ограниченные контексты DDD
- не полная поддержка ACID принципов транзакции: Isolation не обеспечивается. Локальные транзакции комитятся и другие транзакции уже видят их, но в итоге SAGA может быть отменена с компенсаций
- решается False Negative (Вася забронировал Audi, а Петя уже не смог и купил Ford, а затем сбой у Васи и Audi свободна)
Паттерны
- машины состояний state machine
- наблюдателя (Observer) для логирования
- Реализация при помощи Хореографии или Оркестрации
- Для повышения надежности при асинхронном обмене событиями через Message Broker используется Transactional Outbox
Технологии
- Хореография Debezium + Kafka
- serverless saga pattern by using AWS Step Functions
- MassTransit example
- https://axoniq.io
- https://eventuate.io/abouteventuatetram.html
- https://github.com/eclipse/microprofile-lra
- https://github.com/jbosstm/narayana/tree/master/rts/lra
- Оркестрация
- camunda
- Apache Airflow
- Azure Durable Functions
- Apache Camel Saga
- NServiceBus Saga