Каждый сервис выполняет свою операцию локально и передает управление следующему. Внутри Саги транзакции делятся на 3 типа:
1. Compensable Transaction (Компенсируемая транзакция)
Это операция, которую можно «отменить», выполнив обратные действия (разблокировать товар, вернуть деньги).
Python
def reserve_item(item_id, quantity):
# Уменьшаем доступное количество
update_stock(item_id, available_qty - quantity)
return {"reserved": True, "item_id": item_id}
def cancel_reservation(item_id, quantity): # КОМПЕНСИРУЮЩАЯ ОПЕРАЦИЯ
# Возвращаем товар в доступные
update_stock(item_id, available_qty + quantity)
return {"reservation_cancelled": True}
2. Pivot Transaction (Точка невозврата)
Это момент, после которого мы НЕ можем откатить действия. Например: отправка физического товара курьером или отправка SMS. Пивот-транзакция должна быть максимально надежной.
3. Retryable Transaction (Повторяемая транзакция)
Операция после пивот-точки, которую можно безопасно повторять (ретраить) до успешного завершения. Ключевое слово здесь — идемпотентность.
Конечно, бесконечно никто не будет ретраить. После N попыток сервис запишет это событие в отдельную БД или очередь. И на них будет настроен алерт, чтобы оповещать разработчиков об ошибке в системе.