BEGIN → COMMIT → ROLLBACK.
Но в распределённых системах всё резко усложняется.
В чём реальная проблема ???
В распределённых системах нельзя сделать одну транзакцию на всё сразу по нескольким причинам:
- несколько сервисов
- несколько баз данных
- множество возможных отказов
Классического rollback больше не существует.
И тут появляется паттерн Saga.
Saga это последовательность локальных транзакций, которые координируются между собой.
Каждый шаг:
- выполняет своё изменение
- фиксируется
- и определяет, как себя компенсировать, если дальше что-то пойдёт не так
Глобальной транзакции нет.
Есть eventual consistency.
Простой пример » Создание заказа может включать:
1. Создать заказ
2. Зарезервировать товар
3. Провести оплату
Если на шаге 3 происходит сбой, глобального rollback нет.
Выполняются компенсирующие действия:
- освободить резерв
- пометить заказ как отменённый
Это и есть Saga.
Два способа реализации Saga -
Хореография:
- сервисы реагируют на события
- центрального координатора нет
- слабая связность
- сложнее проследить общий поток
Оркестрация:
- есть компонент-координатор
- поток шагов явно описан
- проще рассуждать о логике
- выше связность
Ни один подход не является универсально лучшим.
Всё зависит от системы и контекста.
Частая ошибка » Считать, что Saga — это замена ACID-транзакциям.
Это не так.
Saga меняет сам контракт:
- допускаются промежуточные состояния
- компенсации проектируются явно
- принимается факт, что система может упасть на середине процесса
Когда Saga действительно имеет смысл
- долгоживущие процессы
- несколько сервисов
- реальные побочные эффекты: платежи, доставки, резервы
- ситуации, где технического rollback не существует
Если всё находится в одной базе данных, Saga не нужна. Здесь легко уйти в оверинжиниринг.
Ключевая мысль:
Saga не убирает сложность.
Она делает её явной.
Явная сложность лучше, чем спрятанная за предположениями, которые больше не работают.
В распределённых системах сбои — это не исключение, а часть нормального потока.
Паттерн Saga не избавляет от всех проблем,
но помогает избежать беспорядка.
А в продакшене это уже большая разница. ☃️
👉 Java Portal