Como implementar transações distribuídas com Saga Pattern
Descubra como dividir grandes transações em microtransações seguras e orquestrar múltiplos serviços em sistemas modernos sem riscos ocultos.
Por que isso é importante
Quando um pedido depende de vários serviços – estoque, análise de crédito, pagamentos – uma falha em qualquer etapa pode custar caro. Sem uma orquestração inteligente, empresas perdem vendas, geram inconsistências e criam experiências ruins para o usuário. Entender e aplicar o pattern de Saga é o que separa sistemas frágeis de arquiteturas realmente modernas e resilientes.
Por que transações multi-serviço são traiçoeiras
Se você já criou um sistema onde um pedido só pode ser finalizado quando múltiplos serviços respondem – estoque, crédito, entrega – sabe o caos que pode acontecer em caso de falha. Restrição de estoque, nome sujo, erro na verificação de crédito: se algo dá errado depois que seu pedido é marcado como concluído, você terá problemas reais na produção.
⚠️Atenção
Executar chamadas REST sincronamente para cada serviço a cada pedido é risco certo de inconsistencia e lentidão. A cada aumento na base de usuários, o risco escala.
O atalho perigoso: REST para tudo?
Parece fácil: ao receber um novo pedido, chama-se um serviço REST para o estoque, outro para o crédito, mais um para envio. Caso todos respondam ok, marca-se o pedido como “created”. Mas e se o estoque muda depois? E se a comunicação cai na metade? E se um serviço está fora do ar naquele instante?
❌Erro clássico
Marcar um pedido como criado antes de garantir a validação de serviços externos pode gerar entregas inviáveis, vendas sem estoque e até fraudes.
Saga Pattern: onde grandes sistemas viram robustos
O pattern de SAGA desmonta grandes transações em microtransações ordenadas via eventos, não comandos encadeados. Cada serviço decide e publica seu resultado: estoque reservado? Crédito aprovado? Só avança se tudo estiver em ordem. Não há um “reset” global; há sim compensações e retomadas sem travar ninguém.
ℹ️Dica técnica
Troque “pedido criado” direto para um status “pending” até que todos os eventos necessários ocorram. Só passe para “created” após todos os serviços confirmarem sucesso.
Como funciona na prática: passo a passo essencial
1. Pedido iniciado, evento disparado
Ao receber um novo pedido, não crie nem marque como concluído. Publique um evento do tipo “order filled” num message broker – Kafka, RabbitMQ, ou o que preferir.
2. Estoque, crédito e companhia escutam eventos
O serviço de estoque consome o evento: verifica a existência do produto e responde publicando “StockAvailable” ou “StockUnavailable”. O mesmo vale para o serviço de crédito: “CreditApproved” ou “CreditDenied”.
3. O pedido muda de status a cada microtransação
O serviço do pedido escuta todos esses eventos e atualiza seu status. Só marca como “created” (criado) se todas as respostas forem positivas – caso contrário, mantém como “pending” ou lança status de erro/aborto.
⚠️Atenção
Jamais envie confirmação para o cliente antes de todos os serviços responderem. Erros parciais levam a pedidos fantasmas.
Por dentro das microtransações: o segredo da robustez
Desmembrar uma tarefa crítica em passos menores torna o sistema antifrágil. Cada microtransação é autônoma, gera logs próprios e pode ser revertida sem travar todo o processo.
⚠️Atenção
Evite “big transaction” centralizadas: além de lentas, são quase impossíveis de manter escaláveis em ambientes de microserviços.
Por que “eventos” vencem “requisições REST”
Ao apostar em eventos assíncronos publicados em um message broker, os serviços ficam desacoplados. Isso abre caminho para resiliência, balanceamento de carga e capacidade de retry automático em caso de falhas pontuais.
ℹ️Comparação
REST funciona bem até os fluxos ficarem complexos. Eventos, porém, suportam orquestrações muito além do trivial, de forma flexível.
Status e rastreabilidade: visibilidade total
Ao dividir transações, cada evento deixa seu rastro. Da criação do pedido à reserva de estoque, à análise de crédito, você pode saber exatamente onde e por que ocorreu alguma falha – fundamental em sistemas críticos e auditáveis.
Rollback distribuído: o desafio dos erros
Quando algo falha, a SAGA não tenta desfazer “tudo”. Usa transações compensatórias: por exemplo, se a reserva do estoque falha após aprovação de crédito, publica-se um evento de compensação para liberar o crédito.
⚠️Atenção ao rollback
Escreva cuidadosamente suas ações compensatórias: rollback mal planejado pode criar inconsistências piores que as do fluxo original!
Mensageria: o coração da orquestração
A chave está em um message broker robusto. Ele entrega mensagens mesmo que serviços estejam temporariamente indisponíveis, suporta retries automáticos e permite fácil auditoria dos eventos trafegados.
ℹ️Dica prática
Use brokers consolidados e monitore suas filas: gargalos ou atrasos aqui podem travar a cadeia completa de pedidos.
Como estruturar pedidos e respostas no modelo SAGA
Padronize eventos (OrderFilled, StockAvailable, CreditApproved, etc) e suas respostas. Evite campos ambiguos e deixe claro o responsável por cada status. Cada microserviço só deve tratar eventos previstos a ele – nunca orquestrar tudo sozinho.
⚠️Alerta de design
Nunca centralize toda a inteligência em um único serviço. Distribua responsabilidades para manter a escalabilidade e facilitar manutenções futuras.
Principais erros e como evitar armadilhas
Evite tentar simular transações tradicionais com locks em banco, tente não depender de chamadas sincronas. Abandone a ideia de reverter tudo via delete em massa: sistemas distribuídos não funcionam assim!
❌Erro comum
Forçar commit global simulando begin/commit/rollback em múltiplos bancos/sistemas é pedir para perder dados críticos.
SAGA Pattern: síntese para memorizar
Em sistemas de múltiplos serviços, quebre tudo em microtransações. Prefira eventos assíncronos via mensageria. Nunca marque como pronto antes de cada etapa crucial realmente terminar. E registre tudo: eventos são logs vivos do seu negócio.
Ver na prática, no código e em vídeo
Quer ver um exemplo real de pedido, estoque e crédito conectados por SAGA e eventos? Assista ao vídeo detalhado no canal Dev Doido no Youtube para ver como implementar cada passo na sua stack.
✅Ir além
No canal Dev Doido, sempre o código vem antes das promessas. Cada detalhe do SAGA Pattern e muitos exemplos práticos estão lá, toda semana!