Загрузка…
Загрузка…
В микросервисах классическая ACID-транзакция между несколькими БД/сервисами обычно непрактична. Таким образом, межсервисная «транзакция» строится посредством согласованной бизнес-процедуры с компенсациями и конечной согласованностью.
последовательность локальных транзакций в сервисах;
в случае отказа срабатывают компенсирующие действия.
— службы реагируют на события друг друга без центрального проводника.
Разбейте процесс на локальные атомарные этапы.
Для каждого шага определите компенсацию.
Обеспечить идемпотентность команд и событий.
Внедрите надежную доставку по шаблонам «исходящие/входящие».
Добавьте корреляционный transaction/saga id для трассировки.
Идемпотентность на всех границах.
Повторить попытку в случае временных сбоев.
Дедупликация повторно доставленных событий.
Политика тайм-аута и недоставленных сообщений для «зависающих» шагов.
Наблюдаемость: статусы саг, метрики, аудит.
Межсервисная транзакция в микросервисах — это не глобальный ACID, а управляемый процесс согласованности: локальные транзакции + события + компенсации. Наиболее практичной моделью для этого является Saga с четкими инвариантами и надежной обработкой ошибок.
// Спрощений оркестратор Saga
func (s *Saga) Run(ctx context.Context, cmd CreateOrder) error {
if err := s.reserveInventory(ctx, cmd); err != nil {
return err
}
if err := s.chargePayment(ctx, cmd); err != nil {
_ = s.compensateInventory(ctx, cmd)
return err
}
return s.confirmOrder(ctx, cmd)
}В микросервисах классическая ACID-транзакция между несколькими БД/сервисами обычно непрактична.
