Есть такой паттерн реализации распределённой транзакции (когда нужно выполнить какие-то действия транзакционно в нескольких разных сервисах) - Saga. В случае если один из сервисов не смог завершить у себя транзакцию - он отправляет другим сервисам компенсирующие действия (либо можно завести оркестратор).
Сценарий:
Вы решили жениться.
Шаг 1: Забронировали ресторан ✅
Шаг 2: Разослали приглашения ✅
Шаг 3: Заказали кольца → отправили в Kafka-топик «wedding.rings»…
…но сообщение потерялось (consumer упал, offset сбился, продюсер не дождался ack).
Что делать?
В мире транзакций — откат всего. Но в распределённой системе отката нет.
Зато есть компенсирующие действия:
Отменить бронь ресторана;
Отправить гостям «свадьба отменяется»;
Вернуть депозит за торт;
Это и есть Saga Pattern: цепочка локальных транзакций + набор «отмен», если что-то пошло не так.
Мораль:
В микросервисах нельзя просто «нажать Ctrl+Z».
Но можно аккуратно развестись до свадьбы — автоматически.
Сценарий:
Вы решили жениться.
Шаг 1: Забронировали ресторан ✅
Шаг 2: Разослали приглашения ✅
Шаг 3: Заказали кольца → отправили в Kafka-топик «wedding.rings»…
…но сообщение потерялось (consumer упал, offset сбился, продюсер не дождался ack).
Что делать?
В мире транзакций — откат всего. Но в распределённой системе отката нет.
Зато есть компенсирующие действия:
Отменить бронь ресторана;
Отправить гостям «свадьба отменяется»;
Вернуть депозит за торт;
Это и есть Saga Pattern: цепочка локальных транзакций + набор «отмен», если что-то пошло не так.
Мораль:
В микросервисах нельзя просто «нажать Ctrl+Z».
Но можно аккуратно развестись до свадьбы — автоматически.