Architectural Decision Story · ADS-02
Event-driven architecture
Quando mensageria realmente resolve um problema?
Contexto
Ações em um domínio precisam disparar efeitos em outros — notificar sistemas externos, atualizar estoque, enviar webhooks — sem acoplar quem produz a quem consome.
Problema
Publicar eventos “depois” de salvar o estado abre uma janela em que um dos dois se perde. Mensageria mal aplicada troca acoplamento visível por acoplamento invisível.
Alternativas consideradas
- Chamada síncrona
- O chamador precisa da resposta para continuar e a dependência é estável.
- Eventos com outbox transacional
- O efeito pode ser assíncrono, mas não pode ser perdido.
- Fila de tarefas simples
- Trabalho pesado ou lento sem múltiplos consumidores.
Trade-offs
- Desacoplamento e resiliência versus consistência eventual e depuração mais difícil.
- Outbox garante atomicidade entre estado e evento, ao custo de uma tabela e um despachante a operar.
- Consumidores precisam ser idempotentes: entregas duplicadas são normais.
Decisão
Usar eventos quando há múltiplos interessados ou quando o efeito pode atrasar mas não pode falhar silenciosamente — sempre com outbox, idempotência no consumidor e rastreabilidade de entrega.
Consequências
- Cada evento vira contrato: versionamento e catálogo de eventos passam a ser necessários.
- Observabilidade de filas (atraso, falhas, reprocesso) deixa de ser opcional.
Aprendizados
- Mensageria resolve acoplamento temporal, não acoplamento de domínio.
- Se um evento pode ser perdido, ele não é um evento de negócio — é uma esperança.