Разбираем SAGA по шагам

Каждый сервис выполняет свою операцию локально и передает управление следующему. Внутри Саги транзакции делятся на 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 попыток сервис запишет это событие в отдельную БД или очередь. И на них будет настроен алерт, чтобы оповещать разработчиков об ошибке в системе.