Распределённые транзакции и Saga
ACID-транзакции через несколько сервисов невозможны; решение — компенсирующие операции через паттерн Saga.
Почему это важно: Перевод денег между сервисами биллинга и кошелька — классический случай, где традиционные транзакции не работают.
Главная идея
Вместо одной большой транзакции — последовательность локальных транзакций с компенсациями при ошибке.
Как это выглядит на практике
- Сервис заказов создаёт заказ в своей БД.
- Сервис биллинга списывает деньги в своей БД.
- Сервис склада резервирует товар.
- Если на любом шаге ошибка — компенсирующие операции: вернуть деньги, отменить резерв, отменить заказ.
Что происходит под капотом
- Choreography: каждый сервис подписан на события и решает сам, что делать.
- Orchestration: центральный координатор управляет последовательностью.
- Outbox pattern: сервис пишет события в свою БД в одной транзакции с бизнес-данными.
- Идемпотентность критична: компенсации могут срабатывать несколько раз.
Типичные ошибки и заблуждения
- Ошибка: 2PC (two-phase commit) решает проблему. На практике он медленный, хрупкий и плохо масштабируется.
- Ошибка: событийные системы автоматически согласованны. Eventual consistency — это компромисс.
- Ошибка: компенсация = просто 'обратное действие'. Иногда полное обращение невозможно (письмо уже отправлено).
- Ошибка: оркестрация всегда лучше хореографии. У каждого подхода свои плюсы и минусы.
Ключевые выводы
- ACID между сервисами невозможен на практике.
- Saga = локальные транзакции + компенсации.
- Outbox pattern гарантирует доставку событий.
- Идемпотентность — обязательна для надёжности.
Термины урока
Связь с работой backend-разработчика
Распределённые транзакции — одна из самых сложных тем backend-разработки. Saga и outbox — стандартные инструменты, без которых надёжность недостижима.
Мини-разбор реальной ситуации
Сервис оплаты падал между списанием и созданием заказа: деньги уходили, заказ не создавался. После внедрения Saga с компенсацией возврата таких случаев не стало.
Что запомнить
- ACID не работает между сервисами.
- Saga + outbox — стандартное решение.
- Идемпотентность — обязательна.
Итог
Распределённые транзакции — про принятие компромиссов: между согласованностью, доступностью и сложностью.
Комментарии к уроку
Войдите, чтобы оставить комментарий.
Пока нет комментариев — будьте первым.