Продвинутый

Распределённые транзакции и Saga

Урок 3 из 3 в курсе Микросервисная архитектура

Содержание курса (3/3)

Распределённые транзакции и Saga

ACID-транзакции через несколько сервисов невозможны; решение — компенсирующие операции через паттерн Saga.

Почему это важно: Перевод денег между сервисами биллинга и кошелька — классический случай, где традиционные транзакции не работают.

Главная идея

Вместо одной большой транзакции — последовательность локальных транзакций с компенсациями при ошибке.

Как это выглядит на практике

  1. Сервис заказов создаёт заказ в своей БД.
  2. Сервис биллинга списывает деньги в своей БД.
  3. Сервис склада резервирует товар.
  4. Если на любом шаге ошибка — компенсирующие операции: вернуть деньги, отменить резерв, отменить заказ.

Что происходит под капотом

  • Choreography: каждый сервис подписан на события и решает сам, что делать.
  • Orchestration: центральный координатор управляет последовательностью.
  • Outbox pattern: сервис пишет события в свою БД в одной транзакции с бизнес-данными.
  • Идемпотентность критична: компенсации могут срабатывать несколько раз.

Типичные ошибки и заблуждения

  • Ошибка: 2PC (two-phase commit) решает проблему. На практике он медленный, хрупкий и плохо масштабируется.
  • Ошибка: событийные системы автоматически согласованны. Eventual consistency — это компромисс.
  • Ошибка: компенсация = просто 'обратное действие'. Иногда полное обращение невозможно (письмо уже отправлено).
  • Ошибка: оркестрация всегда лучше хореографии. У каждого подхода свои плюсы и минусы.

Ключевые выводы

  • ACID между сервисами невозможен на практике.
  • Saga = локальные транзакции + компенсации.
  • Outbox pattern гарантирует доставку событий.
  • Идемпотентность — обязательна для надёжности.

Термины урока

Saga: последовательность локальных транзакций с компенсациями.
Choreography: децентрализованная координация через события.
Orchestration: централизованная координация через координатор.
Outbox pattern: запись событий в БД в одной транзакции с данными.
Eventual consistency: согласованность, достигаемая со временем.

Связь с работой backend-разработчика

Распределённые транзакции — одна из самых сложных тем backend-разработки. Saga и outbox — стандартные инструменты, без которых надёжность недостижима.

Мини-разбор реальной ситуации

Сервис оплаты падал между списанием и созданием заказа: деньги уходили, заказ не создавался. После внедрения Saga с компенсацией возврата таких случаев не стало.

Что запомнить

  • ACID не работает между сервисами.
  • Saga + outbox — стандартное решение.
  • Идемпотентность — обязательна.

Итог

Распределённые транзакции — про принятие компромиссов: между согласованностью, доступностью и сложностью.

Комментарии к уроку

Войдите, чтобы оставить комментарий.

Пока нет комментариев — будьте первым.