Что такое паттерн SAGA

Ответ

SAGA — это паттерн для управления распределёнными транзакциями в микросервисной архитектуре. Он разбивает длинную транзакцию на последовательность локальных операций, каждая из которых выполняется в своём сервисе. Если одна операция завершается неудачей, SAGA запускает компенсирующие транзакции для отката предыдущих шагов.

Пример сценария:

  1. Сервис заказов создаёт заказ (шаг 1).
  2. Сервис оплаты резервирует средства (шаг 2).
  3. Если доставка не может быть выполнена (ошибка на шаге 3), SAGA запускает компенсацию: отменяет резерв и удаляет заказ.

Типы реализации:

  • Хореография (без центрального координатора, сервисы общаются через события).
  • Оркестрация (центральный координатор управляет процессом).
// Пример оркестрации (псевдокод)
class OrderSaga {
  async execute() {
    try {
      await orderService.create();
      await paymentService.reserve();
      await deliveryService.schedule();
    } catch (error) {
      await paymentService.cancelReserve(); // Компенсация
      await orderService.cancel(); 
    }
  }
}

Ответ 18+ 🔞

Да ты посмотри, какая хуйня придумана для этих ваших микросервисов! SAGA, блядь. Красивое название, а суть-то простая, как три копейки.

Вот представь, у тебя куча мелких контор, и каждая свою хуйню делает. А тебе надо, чтобы они вместе какую-то общую, длинную операцию провернули. Например, заказ оформить: одна контора заказ создаст, вторая бабки спишет, третья доставку организует. И если на третьем шаге всё пошло по пизде — курьер сломался, — то надо всё назад откатить, как будто ничего и не было. Вот для этого и нужна эта SAGA, ёпта.

Она эту длинную, ебучую транзакцию на куски режет. Каждый сервис делает своё маленькое дело. А если где-то пиздец, то запускаются компенсирующие транзакции — это такие откатные операции, которые всё по-тихому возвращают как было. Типа: «ой, извините, мы ваши деньги назад вернули, заказ удалили, всё чисто».

Как это может работать? А есть два подхода, на выбор:

  • Хореография. Это когда у тебя нет главного дирижёра. Все сервисы — как мартышлюшки на дискотеке: один сделал своё дело, крикнул «ёбушки-воробушки, я готов!», и следующий начинает своё. Общаются через события. Хаос, но весёлый.
  • Оркестрация. А вот это уже по-взрослому. Тут есть центральный координатор — этакий главный по тарелочкам. Он всем командует: ты — делай это, ты — следующее, а ты — компенсируй, если что. Всё чинно-благородно, под диктовку.
// Вот смотри, как этот главный по тарелочкам может выглядеть (псевдокод)
class OrderSaga {
  async execute() {
    try {
      await orderService.create(); // Шаг 1: создали заказ
      await paymentService.reserve(); // Шаг 2: бабки зарезервировали
      await deliveryService.schedule(); // Шаг 3: пытаемся доставку назначить
    } catch (error) {
      // А тут, сука, пиздец! Доставка не вышла.
      await paymentService.cancelReserve(); // Компенсация: бабки возвращаем
      await orderService.cancel(); // Компенсация: заказ хуячим в помойку
    }
  }
}

Вот и вся магия, блядь. Сначала пытаемся сделать всё по цепочке, а если где-то обосрались — начинаем пятиться назад, откатывая каждый шаг. Главное — не запутаться в этом танце с бубном, а то можно так накомпенсировать, что волосы дыбом встанут.