Паттерн Saga


Скандинавские саги Это эпические повествования, рассказывающие о событиях, часто охватывающих значительные периоды времени и множество персонажей

Контекст
ПРоблемная Маша:
Мы применили паттерн Database per service. Теперь у каждого сервиса своя БД. А некоторые бизнес процессы охватывают несколько сервисов. Что делать? Такой бизнес процесс ведь должен быть одной транзакцией!!!
Выручающий Саша:
Ну используй 2PC (двухфазный коммит), чтобы гарантировать транзакцию.
ПРоблемная Маша:
Не могу!
  1. На некоторых сервисах есть БД которые не поддерживают 2PC.
  2. Да и мы внедряли Database per service, чтобы сделать микры слабо связанными и легко масштабировать, а не чтобы затруднить масштабирование через 2PC.
  3. И не хотим всех этих проблем решать с 2PC с вечными транзакциями, сетевые сбои у нас не раз в год, а 3PC мы точно не готовы потянуть.
Выручающий Саша:
Ну если мгновенная согласованность (strong consistency) вам не нужна, и достаточно конечно й согласованности (eventual consistency) то примените паттерн Saga - он решит все ваши проблемы.
Проблема
Как сделать транзакцию, которая будет охватывать несколько независимых микросервисов со своими базами данных?
Решение
Реализовать сагу - последовательность локальных транзакций в каждом микросервисе, каждая такая транзакция обновляет базу данных и публикует сообщение/событие, которое запускает следующую локальную транзакцию.
Если локальная транзакция завершается неудачно, то происходит цепочка компенсирующих транзакций в обратном направлении, которые отменяют изменения.
В итоге такая цепочка локальных транзакций становится одной бизнес транзакцией.

Есть два варианта реализации Saga: хореография, оркестрация.
Хореография
  1. Пришел запрос на покупку товара в Order Service
  2. Order Service публикует Order Created Event
  3. Products Service резервирует у себя в базе товар и публикует Product Reserved Event
  4. Payment Service пробует оплатить, но происходит ошибка Card Authorization Failed Exception
  5. Payment Service публикует событие Card Authorization Failed Event - что инициирует компенсирующую транзакцию
  6. Products Service отменяет бронь продукта в базе данных и публикует Product Reservation Cancelled Event
  7. Order Service отменяет ордер
Оркестрация
  1. Пришел запрос на покупку товара в Order Service
  2. Order Service публикует Order Created Event
  3. Saga читает Order Created Event и публикует команду Reserve Product Command
  4. Products Service резервирует у себя в базе товар и публикует Product Reserved Event
  5. Saga читает Product Reserved Event и публикует команду Process Payment Command
  6. Payment Service пробует оплатить, но происходит ошибка Card Authorization Failed Exception
  7. Payment Service публикует событие Card Authorization Failed Event - что инициирует компенсирующую транзакцию
  8. Saga читает Card Authorization Failed Even и публикует команду Cancel Product Reservation Command
  9. Products Service отменяет бронь продукта в базе данных и публикует Product Reservation Cancelled Event
  10. Saga читает Product Reservation Cancelled Event и публикует команду Reject Order Command
  11. Order Service отменяет ордер
Видео по SAGA
1. SAGA pattern. Хореография и Оркестрация
2. Оркестрация. Пример кода
3. Оркестрация. Пример кода. Продолжение.
4. Компенсирующие транзакции
Онлайн-школа профессионального программирования на java для коммерческих разработчиков и соискателей.
2 главные задачи, которые мы решаем:
  1. Трудоустройство и успешное прохождение испыталки.
  2. Переход на современный стек middle+
Наше главное достояние:
Менторская поддержка 24/7 и обучение в формате живого общения
Получить консультацию по обучению