Микросервисы: как реализовывать распределённые транзакции через несколько микросервисов с возможностью отката? Что такое Saga и Outbox паттерны?
Ответ от нейросети
sobes.tech AI
Распределённые транзакции в микросервисной архитектуре — сложная задача, так как каждый сервис управляет своей базой данных и не существует единого ACID-транзакционного контекста. Для обеспечения согласованности с возможностью отката применяются паттерны Saga и Outbox.
Saga — это последовательность локальных транзакций в разных сервисах, каждая из которых публикует событие для следующей. Если одна из транзакций неудачна, выполняются компенсирующие транзакции для отката предыдущих шагов. Саги бывают двух типов:
- Хореография: сервисы обмениваются событиями напрямую.
- Оркестрация: централизованный координатор управляет выполнением шагов.
Outbox паттерн решает проблему атомарности записи данных и отправки сообщений. Вместо непосредственной отправки сообщения в момент изменения данных, сервис записывает событие в специальную таблицу "outbox" в той же транзакции, что и бизнес-операция. Затем отдельный процесс читает эту таблицу и отправляет сообщения в очередь, гарантируя, что сообщение не потеряется и не будет отправлено дважды.
Пример упрощённой Saga:
- Сервис A создаёт заказ и публикует событие "OrderCreated".
- Сервис B резервирует товар, если успешно — публикует "InventoryReserved".
- Сервис C инициирует оплату, при неудаче публикует "PaymentFailed".
- При ошибке запускаются компенсирующие операции (отмена резерва, отмена заказа).
Таким образом достигается согласованность без глобальных транзакций.