Article
Sistemas event-driven sem folclore
Saiba quando a arquitetura orientada a eventos ajuda, quando atrapalha e como avaliar acoplamento, visibilidade de falhas, custo de replay e sagas.
Article details
Published
August 19, 2026
Reading time
6 min
Main sections
11
Arquitetura event-driven ajuda quando o sistema precisa de baixo acoplamento, trabalho diferido ou fan-out para múltiplos consumidores. Ela prejudica quando os times tratam async como padrão e perdem de vista a visibilidade de falhas, o custo de replay e o fardo operacional do comportamento distribuído.
A pergunta útil não é "event-driven é mais moderno?", e sim "async reduz o custo total deste fluxo de trabalho?". Se a resposta for não, um design síncrono costuma ser mais seguro, mais barato e mais fácil de operar.
O ensaio do Martin Fowler sobre o que significa event-driven ainda é uma boa referência de enquadramento porque separa o estilo do hype. Em produção, porém, a pergunta importante não é o rótulo do padrão. É se você consegue arcar com o modelo de recuperação que vem junto com ele.
O que é arquitetura event-driven
Sistemas event-driven reagem a fatos que já aconteceram: um pedido foi pago, um usuário se cadastrou, um registro mudou. Em vez de forçar todo o trabalho subsequente dentro de uma única requisição em linha, o sistema publica um evento e deixa os consumidores a jusante decidirem o que fazer em seguida.
Esse design desloca a pressão de um lugar para outro. Você não está mais projetando apenas comportamento. Está projetando também contratos, retries, idempotência, replay e ownership.
O verdadeiro trade-off: síncrono vs assíncrono
O trade-off não é arquitetura antiga versus nova. É controle direto versus acoplamento diferido.
| Dimensão | Síncrono | Assíncrono |
|---|---|---|
| Feedback ao usuário | Imediato | Tardio |
| Visibilidade de falha | Clara no ponto da chamada | Distribuída e diferida |
| Acoplamento | Mais estreito | Mais livre |
| Recuperação | Mais fácil de raciocinar | Exige replay e reconciliação |
| Latência | Inclui o trabalho a jusante | Protege o caminho da requisição |
| Fardo operacional | Menor em fluxos simples | Maior conforme consumidores e retries crescem |
Use síncrono quando a correção depende de uma resposta imediata. Use assíncrono quando o trabalho pode acontecer depois sem prejudicar o resultado do negócio.
Quando sistemas event-driven ajudam
Async é mais forte quando o problema de negócio se beneficia de separação no tempo ou na ownership.
Casos típicos:
- uma ação gera fan-out em várias reações independentes
- trabalho lento ou instável a jusante não deveria bloquear o usuário
- o tráfego é rajado e precisa de buffering
- o negócio se beneficia de um histórico durável de fatos de domínio
- múltiplos times precisam evoluir sem acoplamento forte de requisição
Exemplos:
- enviar um e-mail de confirmação após o cadastro
- atualizar analytics após o checkout
- sincronizar um índice de busca após mudanças de conteúdo
- disparar uma revisão antifraude após comportamento suspeito
Quando sistemas event-driven prejudicam
Async fica caro quando o fluxo precisa de:
- correção imediata
- fronteiras transacionais estritas
- baixa ambiguidade sobre sucesso ou falha
- coordenação estreita entre consumidores de qualquer forma
Se um pagamento ou uma checagem de permissão precisa ser autoritativo no momento, um evento costuma ser a abstração errada.
Acoplamento não é só técnico
Sistemas event-driven ainda podem ser fortemente acoplados:
- um consumidor depende de campos que o produtor pode remover
- uma mudança de schema quebra consumidores antigos
- um serviço a jusante se torna o dono oculto de uma regra de negócio
- produtores e consumidores renegociam contratos informalmente toda semana
Acoplamento fraco só existe quando os contratos são estáveis o suficiente para cada lado evoluir de forma independente.
Visibilidade de falha é a conta real
Um barramento de eventos é transporte, não resolução. As perguntas difíceis continuam:
- como você sabe que um evento não foi processado?
- como você detecta processamento duplicado?
- como você se recupera após a queda de um consumidor?
- como você sabe se um consumidor está travado ou apenas lento?
Sem respostas para essas perguntas, async está escondendo risco em vez de gerenciá-lo.
Replay e custo operacional
Replay é um dos custos mais subestimados em sistemas event-driven.
O custo de replay aparece em:
- custo de computação para reprocessar histórico
- custo de coordenação para decidir o que reprocessar e quando
- custo de correção quando lógica antiga interage com estado novo
Replay deveria ser uma capacidade explícita, não uma palavra mágica em diagramas de arquitetura.
A mesma ideia aparece no padrão idempotent consumer: se replay e entrega duplicada são esperados, o contrato do consumidor precisa ser desenhado para isso, e não remendado depois.
Documente:
- quais eventos são replayáveis
- quais consumidores podem rodar de novo com segurança
- como efeitos colaterais duplicados são prevenidos
- como verificar o sucesso do replay
Sagas e fluxos de longa duração
Sagas são úteis quando um processo de negócio atravessa múltiplos serviços e o rollback precisa ser explícito em vez de transacional.
Use uma saga quando:
- o fluxo é de longa duração
- cada passo tem um efeito colateral independente
- a compensação precisa ser modelada intencionalmente
- a conclusão eventual é aceitável
Não use uma saga só porque uma transação parece inconveniente. Ela continua sendo uma máquina de estados complexa, com seus próprios caminhos de falha e recuperação.
O texto do Chris Richardson sobre o padrão Saga é útil aqui porque deixa o trade explícito: sagas mantêm consistência entre serviços, mas trocam rollback automático por lógica compensatória que agora é sua responsabilidade.
Checklist de decisão
Use este checklist antes de escolher arquitetura event-driven:
- O chamador precisa de sucesso ou falha imediatos?
- O trabalho a jusante pode acontecer depois sem prejudicar a correção?
- O fluxo tem fan-out pesado o suficiente para justificar o desacoplamento?
- Você consegue observar lag, falhas e retries com clareza?
- Você tem consumidores idempotentes e um caminho seguro de replay?
- Os contratos de evento têm regras de ownership e versionamento?
- Uma requisição síncrona seria mais simples e mais barata de operar?
Se mais de duas respostas forem incertas, o sistema provavelmente não está pronto para async.
Defaults práticos de implementação
- defina eventos como fatos de negócio, não como payloads de transporte
- atribua ownership clara de schema
- torne os consumidores idempotentes antes de adicionar retries
- acompanhe lag, volume de dead-letter e taxa de falha
- documente os procedimentos de replay e compensação
Como este tema se conecta
Se você precisa da camada de duplicatas e retries na borda do sistema, leia Idempotência para webhooks. Se você precisa da camada de visibilidade operacional que torna sistemas async depuráveis, leia Observabilidade para engenheiros de produto. E se você está apostando em filas para todo problema, leia Filas não são bala de prata.
Related articles
Article
Idempotência para webhooks
Leia também: Idempotência para webhooks, Filas não são bala de prata e Observabilidade para engenheiros de produto.
Article
Filas não são bala de prata
Leia também: Idempotência para webhooks, Filas não são bala de prata e Observabilidade para engenheiros de produto.
Article
Observabilidade para engenheiros de produto
Leia também: Idempotência para webhooks, Filas não são bala de prata e Observabilidade para engenheiros de produto.
Need help applying this?
Turn the trade-off into a practical product decision.
Se você quer ajuda para decidir se um fluxo deve continuar síncrono, virar event-driven ou ser modelado como saga, o primeiro passo é entender o custo real de cada caminho. Comece com um get in touch.
FAQ
Common questions before committing to the pattern.
Quando devo evitar arquitetura event-driven?+
Evite quando o chamador precisa de uma resposta imediata, quando o fluxo é simples ou quando a falha precisa continuar visível no ponto da chamada.
Qual é o principal custo oculto de sistemas async?+
Complexidade operacional: retries, replay, lag, gestão de schema e debugging atravessando fronteiras de serviço.
Eventos são sempre melhores para escalabilidade?+
Não. Eles protegem o caminho da requisição, mas também empurram complexidade para a recuperação e a observabilidade. Esse trade-off só se paga nos fluxos certos.
Quando devo usar uma saga em vez de um evento simples?+
Quando o processo atravessa múltiplos serviços e a compensação precisa ser modelada explicitamente.
O que tornar idempotente primeiro?+
O efeito colateral do consumidor. Retries, replay e recuperação diferida dependem dessa base.