🧑🎓Объяснение:
Это классическая задача распределённых транзакций в микросервисной архитектуре. В монолите всё просто: одна база, одна транзакция. В микросервисах — у каждого сервиса своя база, и ACID-транзакция между ними невозможна без катастрофических последствий для производительности.
1. Почему другие варианты не работают?
❌ A (двухфазная фиксация / 2PC):
Требует распределённого менеджера транзакций, который блокирует ресурсы во всех сервисах на время выполнения.
В высоконагруженных системах это убивает производительность.
Многие современные СУБД и NoSQL не поддерживают 2PC.
Создаёт единую точку отказа и проблемы с масштабированием.
❌ C (общая база данных):
Это возврат к монолиту, отрицающий все преимущества микросервисов.
Сервисы становятся жёстко связаны через схему данных.
Невозможно масштабировать сервисы независимо.
Изменение схемы одной командой ломает другие сервисы.
❌ D (синхронные API с ручным откатом):
При сбое после части операций невозможно гарантированно откатить изменения.
Например: деньги списались, а товар не зарезервировался. Как вернуть деньги?
Ручной откат — это не автоматизированное решение, чреватое ошибками.
2. Что такое паттерн Saga?
Saga (сага) — это последовательность локальных транзакций, каждая из которых обновляет данные в одном сервисе. Если одна транзакция провалилась, запускаются компенсирующие транзакции, которые откатывают изменения предыдущих шагов.
Варианты реализации:
Хореография (Choreography): сервисы обмениваются событиями без центрального координатора.
```text
1. Сервис заказов: создаёт заказ со статусом PENDING, публикует событие "OrderCreated"
2. Сервис платежей: слушает событие, списывает деньги, публикует "PaymentProcessed" или "PaymentFailed"
3. Сервис склада: слушает "PaymentProcessed", резервирует товар, публикует "StockReserved" или "StockFailed"
4. Если "StockFailed" — сервис платежей компенсирует (возвращает деньги)
Оркестрация (Orchestration): центральный координатор (оркестратор) управляет шагами и компенсациями.
```
```text
Оркестратор:
- Запустить списание денег
- Если успех → запустить резервирование товара
- Если ошибка → запустить возврат денег
```
3. Реальный кейс
Крупный маркетплейс внедрил Saga после перехода на микросервисы. Раньше при сбое после списания денег, но до резервирования товара, заказ "зависал" в статусе "оплачен, но не отгружен". Клиенты жаловались, деньги не возвращались сутками.
После внедрения Saga с хореографией через Kafka:
При ошибке резервирования товара сервис платежей автоматически получал событие StockReservationFailed и возвращал деньги в течение 30 секунд.
Клиент видел понятное сообщение "Товар закончился, деньги вернутся".
Процент потерянных заказов снизился до нуля.
4. Что должен заложить аналитик в требования?
Идентификация бизнес-процессов, требующих согласованности.
Определение компенсирующих действий для каждого шага (что делать при отказе).
Выбор модели (хореография или оркестрация) на основе сложности процесса.
Требования к идемпотентности: сообщения могут приходить повторно, операции не должны дублироваться.
Таймауты и мониторинг: "зависшие" саги должны отслеживаться и завершаться принудительно.
5. Важные нюансы
Конечная согласованность (eventual consistency): в микросервисах данные не будут согласованы мгновенно. Это нормально для многих бизнес-процессов, но нужно согласовать с бизнесом допустимое окно.
Компенсации vs откаты: в распределённых системах нет атомарного отката, есть компенсации (делаем обратное действие). Это сложнее, но единственный масштабируемый способ.
Мониторинг: каждая сага должна логироваться, чтобы можно было отследить "зависшие" процессы.