TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #2023 2.24K
Когда всё живёт в одной базе данных, с транзакциями всё просто.

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
  • 👍 5
  • ❤ 1
More from @java_iibrary
  1. Sep 27, 2026Java-разработчики, CopyOnWriteArrayList создаёт копию всего внутреннего массива при каждом…
  2. Sep 27, 2026Java-разработчики, ConcurrentHashMap потокобезопасен. Но он не блокирует всю коллекцию при…
  3. Sep 26, 2026Во многих приложениях есть такой эндпоинт. Фронтенд удаляет JWT после того, как пользовате…
  4. Sep 26, 2026Java: используйте Deque вместо Stack для работы по принципу LIFO («последним пришёл — перв…
  5. Sep 25, 2026Каждый Java-разработчик использует HashMap. Но задумывались ли вы… Почему его ёмкость всег…
  6. Sep 25, 2026Бесплатные ресурсы для изучения Java Конспект Effective Java — HugoMatilla/Effective-JAVA-…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →