Marcio Cunha

Processamento de Transações Distribuídas com Sagas Orquestradas e Event Sourcing

Descubra como coordenar operações complexas em microsserviços mantendo consistência eventual sem travar o banco de dados. Uma análise prática sobre o padrão Saga aliado ao registro imutável de eventos.

Marcio Cunha•5 min
Também disponível em:EnglishEspañol
Resumo
  • Sistemas distribuídos modernos exigem abandonar o controle clássico de transações em favor da consistência eventual controlada por eventos.
  • A escolha entre coreografia e orquestração define se a lógica de compensação vive espalhada nos serviços ou centralizada em um componente dedicado.
  • O registro imutável de estado garante auditoria completa e reprocessamento seguro de falhas sem perda de dados históricos.
  • Transações de longa duração precisam prever falhas de rede e indisponibilidade temporária de parceiros externos desde a concepção do desenho.
  • O uso correto de compensações garante que o sistema retorne a um estado consistente mesmo após falhas parciais em etapas avançadas.

O Desafio das Transações Distribuídas em Microsserviços

Quando dividimos um sistema monolítico gigante em vários pedaços menores chamados microsserviços, ganhamos liberdade para escalar cada função de forma isolada. Em um monolito, garantir que uma compra aconteça inteiramente, desde cobrar o cartão até reservar o estoque, é simples porque tudo usa o mesmo banco de dados com uma instrução chamada transação atômica. Na prática, isso significa que ou tudo funciona junto ou nada é alterado. No mundo distribuído, cada serviço possui seu próprio banco isolado, tornando impossível usar essa facilidade nativa para unir operações que cruzam diferentes fronteiras de servidores.

Para resolver esse problema sem recorrer a bloqueios lentos que travam toda a aplicação, os engenheiros adotam o padrão Saga. Uma Saga é uma sequência de transações locais onde cada passo atualiza dados em um serviço específico e publica um evento avisando que a tarefa foi concluída. Se algo der errado no meio do caminho, a Saga executa transações compensatórias, que na prática funcionam como um desfazimento lógico do que já foi feito, como estornar um pagamento ou devolver um item ao estoque. Esse modelo troca a consistência imediata pela consistência eventual, aceitando que o sistema passe por breves momentos de desalinhamento até que todas as etapas terminem com sucesso.

A Escolha entre Coreografia e Orquestração de Sagas

Existem duas maneiras principais de implementar o padrão Saga: coreografia e orquestração. Na coreografia, não existe um chefe central controlando o fluxo; cada microsserviço escuta os eventos gerados pelos outros e decide autonomamente qual é o próximo passo. Na prática, é como uma dança de salão onde cada participante reage ao movimento do outro sem precisar de um coreógrafo dando ordens em voz alta. Embora funcione bem em fluxos curtos, a coreografia pode rapidamente virar um emaranhado difícil de rastrear quando o processo de negócio envolve dezenas de etapas e regras condicionais complexas.

É nesse cenário que a orquestração ganha espaço. No modelo orquestrado, existe um componente dedicado, chamado de orquestrador, cuja única responsabilidade é ditar o ritmo e a ordem das chamadas. Na prática, o orquestrador recebe a solicitação inicial, envia um comando para o primeiro serviço, aguarda a resposta, toma nota do resultado e despacha o próximo comando. Se qualquer etapa falhar, o próprio orquestrador consulta seu registro interno e dispara os comandos de compensação na ordem inversa exata. Essa centralização traz visibilidade total do processo, facilitando a depuração de erros e a adição de novas regras de negócio sem alterar os serviços de domínio.

Integrando o Registro Imutável de Eventos ao Orquestrador

Para que o orquestrador tome decisões seguras, ele precisa saber exatamente em qual estado o processo se encontra a cada milissegundo. É aqui que entra o conceito de Event Sourcing, que consiste em armazenar todas as mudanças de estado do sistema como uma sequência cronológica de eventos imutáveis, em vez de guardar apenas a foto atual da tabela no banco de dados. Na prática, o banco de dados do orquestrador não grava que um pedido está na etapa 'pago', mas sim a lista exata de tudo o que aconteceu: 'pedido criado', 'pagamento aprovado', 'estoque reservado'. Esse registro funciona como o extrato bancário da aplicação, permitindo reconstruir o estado de qualquer Saga a partir do zero simplesmente reprocessando a história.

Combinar o orquestrador com o Event Sourcing traz uma resiliência impressionante para arquiteturas de alta volumetria. Se o servidor do orquestrador sofrer uma pane elétrica repentina no meio de um fluxo complexo, ele não perde o fio da meada ao reiniciar. Basta ler os últimos eventos gravados e continuar de onde parou, sem duplicar cobranças ou deixar pedidos órfãos. Além disso, essa abordagem oferece uma trilha de auditoria completa e transparente, fundamental para atender a requisitos regulatórios rigorosos e facilitar análises de desempenho e gargalos operacionais em tempo real.

Tratamento de Falhas e Transações de Longa Duração

Processos de negócios reais frequentemente envolvem passos que demoram horas ou até dias para serem concluídos, como a verificação manual de crédito ou a entrega física de uma mercadoria. Em transações de longa duração, manter conexões abertas é inviável e perigoso, o que obriga a arquitetura a operar de forma totalmente assíncrona. Na prática, isso significa que o orquestrador despacha uma tarefa, libera os recursos da máquina e entra em um estado de espera passiva até que o evento de resposta chegue através de um barramento de mensagens, como o Apache Kafka ou RabbitMQ.

O grande desafio dessas operações prolongadas é lidar com falhas externas imprevisíveis, como a queda temporária do sistema de uma transportadora parceira. O orquestrador precisa implementar estratégias robustas de repetição inteligente com intervalos crescentes, além de definir prazos máximos de tolerância para cada etapa. Se o parceiro não responder dentro da janela esperada, o orquestrador assume a falha e aciona o fluxo de compensação para desfazer as reservas anteriores. Essa disciplina transforma fluxos caóticos em processos previsíveis, garantindo que o software funcione de maneira confiável mesmo quando o mundo ao redor falha.

Considerações Finais sobre Arquiteturas Orientadas a Eventos

Adotar o padrão Saga orquestrado em conjunto com o registro imutável de eventos exige uma mudança profunda na mentalidade de design dos desenvolvedores e arquitetos de software. Abandonar o conforto das transações tradicionais de banco de dados assusta no início, mas a recompensa em termos de escalabilidade, resiliência e independência entre equipes é incomparável. Na prática, sistemas construídos sob essa fundação conseguem absorver picos massivos de acesso sem derrubar os serviços principais, contendo falhas de forma elegante através de compensações automáticas bem planejadas e garantindo a integridade dos dados a longo prazo.