System Design/05 - Reliability Patterns/Resiliency2 min
Compensating Transaction
- Que problema isso resolve?
- Quando usar / quando NÃO usar?
- Qual o principal trade-off?
- Como isso falha em produção?
Conceito
Desfazer uma operação distribuída que falhou no meio, executando ações que revertem o efeito dos passos já concluídos — já que não existe ROLLBACK entre serviços.
1. reservar estoque ✓
2. cobrar cartão ✓
3. agendar entrega ✗ falhou
→ compensar 2: estornar
→ compensar 1: liberar estoque
É o mecanismo central do padrão Saga: uma sequência de transações locais, cada uma com sua compensação.
Coreografada vs orquestrada
| Choreography | Orquestrada | |
|---|---|---|
| Quem coordena | Cada serviço reage a eventos | Um coordenador (Scheduler Agent Supervisor) |
| Visibilidade | Baixa | Alta |
| Bom para | 2-3 passos simples | Fluxos longos com compensação |
Trade-offs
O padrão existe porque a alternativa — transação distribuída com two-phase commit — trava recursos entre serviços e não escala. A saga troca atomicidade por disponibilidade.
O que se paga:
Compensar não é desfazer. Um estorno não apaga a cobrança: ele adiciona um lançamento contrário. O cliente viu a cobrança, talvez tenha recebido um e-mail, e a fatura mostrará ambos. O efeito no mundo é diferente de "nunca aconteceu".
Existe estado intermediário observável. Entre o passo 2 e a compensação, o sistema está inconsistente e alguém pode ler esse estado. Consistência é eventual, por construção.
Nem tudo é compensável. E-mail enviado, SMS entregue, item físico despachado. Para esses, a ordem dos passos importa: coloque o irreversível por último, quando tudo que podia falhar já passou.
A compensação também falha. E precisa de retry, idempotência e, no limite, intervenção humana. Uma compensação que falha em silêncio deixa o sistema num estado que ninguém sabe que existe — daí a necessidade de um supervisor que detecte processos travados.
Exemplo prático
Reserva de viagem: voo, hotel e carro, cada um num serviço externo.
✓ voo reservado
✓ hotel reservado
✗ carro indisponível
→ compensar hotel: cancelar (pode ter multa)
→ compensar voo: cancelar (pode ter multa)
As multas ilustram o ponto: compensar tem custo real, e o custo é do negócio. Isso muda o desenho — vale ordenar os passos do mais provável de falhar para o menos, para que a compensação seja acionada o mais cedo possível, quando menos coisas precisam ser desfeitas.
E cada cancelamento precisa ser idempotente, porque o supervisor vai reexecutá-lo sem saber se já foi feito.
Relacionado
Parte de Resiliency · roadmap.sh/system-design