Sobes.tech
Назад к вопросам
Middle
7

Микросервисы: как реализовывать распределённые транзакции через несколько микросервисов с возможностью отката? Что такое Saga и Outbox паттерны?

Компании, где спрашивали
Evrone

Ответ от нейросети

sobes.tech AI

Распределённые транзакции в микросервисной архитектуре — сложная задача, так как каждый сервис управляет своей базой данных и не существует единого ACID-транзакционного контекста. Для обеспечения согласованности с возможностью отката применяются паттерны Saga и Outbox.

Saga — это последовательность локальных транзакций в разных сервисах, каждая из которых публикует событие для следующей. Если одна из транзакций неудачна, выполняются компенсирующие транзакции для отката предыдущих шагов. Саги бывают двух типов:

  • Хореография: сервисы обмениваются событиями напрямую.
  • Оркестрация: централизованный координатор управляет выполнением шагов.

Outbox паттерн решает проблему атомарности записи данных и отправки сообщений. Вместо непосредственной отправки сообщения в момент изменения данных, сервис записывает событие в специальную таблицу "outbox" в той же транзакции, что и бизнес-операция. Затем отдельный процесс читает эту таблицу и отправляет сообщения в очередь, гарантируя, что сообщение не потеряется и не будет отправлено дважды.

Пример упрощённой Saga:

  1. Сервис A создаёт заказ и публикует событие "OrderCreated".
  2. Сервис B резервирует товар, если успешно — публикует "InventoryReserved".
  3. Сервис C инициирует оплату, при неудаче публикует "PaymentFailed".
  4. При ошибке запускаются компенсирующие операции (отмена резерва, отмена заказа).

Таким образом достигается согласованность без глобальных транзакций.