Capa do artigo: Arquitetura Orientada a Eventos: Guia Prático

Arquitetura Orientada a Eventos: Guia Prático

Por Mattos Tech Solutions11 min de leitura

Entenda quando usar arquitetura orientada a eventos e como projetar filas, contratos, idempotência, observabilidade e recuperação de falhas.

O que é arquitetura orientada a eventos?

Arquitetura orientada a eventos é uma forma de integrar sistemas na qual componentes publicam fatos relevantes — como “pedido aprovado”, “pagamento confirmado” ou “arquivo recebido” — e outros componentes reagem a eles. Em vez de o sistema de origem conhecer e chamar diretamente todos os destinos, um broker, barramento, fila ou stream transporta as mensagens.

O modelo é especialmente útil quando diferentes processos precisam reagir ao mesmo acontecimento, quando uma dependência pode ficar temporariamente indisponível ou quando há picos de demanda. Porém, ele adiciona consistência eventual, contratos distribuídos e novas responsabilidades operacionais. Se uma resposta imediata é indispensável e o fluxo envolve poucos sistemas estáveis, uma API síncrona pode continuar sendo a solução mais simples.

A decisão, portanto, não deve começar por Kafka, RabbitMQ ou um serviço de nuvem. Deve começar pelo processo de negócio, pelos requisitos de tempo, volume, disponibilidade, rastreabilidade e recuperação.

Evento, comando, fila e tópico não são sinônimos

Uma boa arquitetura depende de uma linguagem comum.

  • Evento: registra um fato que já aconteceu, como “NotaFiscalEmitida”. O nome costuma estar no passado e o produtor não determina quem deve reagir.
  • Comando: solicita que uma ação seja executada, como “EmitirNotaFiscal”. Pode ser recusado e normalmente possui um destinatário ou uma responsabilidade definida.
  • Mensagem: é o envelope transportado pela infraestrutura. Pode carregar um evento, um comando ou outro tipo de dado.
  • Fila: distribui trabalho entre consumidores. Em geral, uma mensagem é processada por um integrante do grupo consumidor.
  • Publicação/assinatura: entrega o mesmo evento para assinaturas diferentes. Faturamento, logística e analytics podem reagir de forma independente.
  • Stream: mantém uma sequência de eventos em um log durável, permitindo que consumidores acompanhem posições e, quando a plataforma oferece suporte, releiam o histórico.

A documentação do Apache Kafka descreve eventos armazenados em tópicos particionados e consumidores desacoplados dos produtores. Já o guia de arquitetura orientada a eventos da Microsoft diferencia publicação/assinatura de streaming e chama atenção para granularidade, ordenação e evolução de schema.

Quando a arquitetura orientada a eventos faz sentido

Um fato precisa acionar vários processos

Imagine a aprovação de um pedido. Esse fato pode reservar estoque, iniciar faturamento, avisar a logística, atualizar o CRM e alimentar indicadores. Fazer o sistema de pedidos chamar cada destino cria uma cadeia de dependências: um novo consumidor exige alteração no produtor e uma falha remota pode afetar a transação principal.

Com publicação/assinatura, cada área recebe o evento de forma independente. O produtor publica o fato uma vez; os consumidores evoluem conforme contratos acordados.

Há picos ou dependências instáveis

Uma fila pode absorver uma entrada maior que a capacidade momentânea do serviço consumidor. A aplicação aceita a solicitação, persiste o trabalho e o processa no ritmo suportado pelo destino. O padrão de nivelamento por fila é explicado no cenário de integração empresarial da Microsoft.

Isso não elimina limites. Apenas desloca o ponto de controle: profundidade da fila, idade da mensagem mais antiga, capacidade dos consumidores e prazo prometido ao usuário passam a ser métricas essenciais.

O processamento pode ser assíncrono

Geração de relatórios, envio de notificações, análise de arquivos e sincronização com terceiros geralmente não precisam concluir dentro da requisição do usuário. Nesses casos, a interface pode informar que o trabalho foi aceito e disponibilizar um status para consulta.

“Assíncrono” não significa “sem retorno”. A experiência precisa mostrar estados como recebido, em processamento, concluído e falhou, além de orientar o que fazer quando o prazo esperado for excedido.

Integrações precisam evoluir de forma independente

Eventos reduzem o acoplamento temporal: produtor e consumidor não precisam estar disponíveis ao mesmo tempo. Também reduzem o acoplamento de implantação, desde que contratos sejam compatíveis. Isso ajuda em integrações entre sistemas legados, SaaS, aplicações próprias e plataformas de dados.

Se o problema atual é copiar informações entre sistemas, vale primeiro mapear o fluxo e comparar eventos com as alternativas descritas no guia de integração de sistemas via API.

Quando não usar

Arquitetura orientada a eventos não é uma evolução obrigatória de todo sistema. Ela pode ser excesso de engenharia quando:

  • o fluxo é pequeno, interno e exige resposta imediata;
  • uma transação precisa confirmar todas as etapas antes de prosseguir;
  • a equipe não possui capacidade para operar broker, consumidores, retentativas e observabilidade;
  • não há requisito de escala, isolamento de falhas ou múltiplos consumidores;
  • um job agendado, uma API ou um webhook bem projetado resolve o processo com menos componentes.

Também não é necessário adotar microsserviços para usar eventos. Um sistema modular pode publicar tarefas para workers ou integrar aplicações externas por mensageria. O ganho deve superar o custo de depuração distribuída, consistência eventual e governança.

Como desenhar uma arquitetura orientada a eventos

1. Comece pelo acontecimento de negócio

Mapeie quem produz o fato, quais consumidores precisam reagir, qual prazo cada reação possui e o que acontece se uma etapa falhar. Prefira nomes de negócio estáveis, como “ClienteCadastrado”, em vez de nomes de telas, tabelas ou implementações.

Diferencie claramente o evento do comando. “PagamentoConfirmado” informa algo ocorrido; “EnviarCobranca” pede uma ação. Essa distinção evita consumidores tentando reinterpretar intenções escondidas.

2. Escolha o padrão de entrega

Use uma fila quando várias instâncias dividem o mesmo trabalho, como processar documentos. Use publicação/assinatura quando diferentes capacidades precisam receber o mesmo fato. Considere streaming quando retenção, replay, ordenação por chave ou processamento contínuo realmente forem requisitos.

A escolha inclui tecnologia, mas não termina nela. Registre retenção, tamanho máximo, criptografia, regiões, custo, limites, recuperação, portabilidade e responsabilidade operacional. Em um projeto de software sob medida, esses critérios devem nascer do fluxo e dos riscos da empresa.

3. Defina um contrato de evento

Um envelope útil normalmente contém:

  • identificador único do evento;
  • tipo e versão do schema;
  • data e hora em UTC;
  • origem;
  • identificador da entidade de negócio;
  • correlation ID ou trace context;
  • payload mínimo necessário;
  • classificação de sensibilidade e prazo de retenção quando aplicável.

O CloudEvents oferece uma especificação aberta para descrever eventos de maneira consistente entre serviços e plataformas. Adotá-la pode facilitar interoperabilidade, mas não substitui a definição semântica do domínio.

Evite publicar dados pessoais ou segredos “por conveniência”. Cada cópia aumenta a superfície de acesso, retenção e exclusão. Quando o consumidor puder buscar detalhes com autorização própria, o evento pode carregar apenas identificadores e os atributos indispensáveis.

4. Planeje a evolução do schema

Produtores e consumidores raramente são implantados juntos. Por isso, mudanças compatíveis devem ser a regra: adicionar campos opcionais costuma ser menos arriscado que remover ou alterar significados. Consumidores precisam ignorar campos desconhecidos e tratar versões não suportadas de forma observável.

Mantenha exemplos, proprietário, finalidade, classificação dos dados e consumidores conhecidos em um catálogo. Testes de contrato ajudam a detectar incompatibilidades antes da produção.

5. Trate duplicidade como cenário normal

Redes falham, confirmações se perdem e mensagens podem ser reenviadas. Em muitos serviços, a garantia prática é “pelo menos uma vez”, portanto o consumidor deve ser idempotente: processar novamente o mesmo identificador sem duplicar cobrança, estoque ou notificação.

Uma implementação comum registra o ID do evento processado junto com a alteração de negócio, dentro da mesma transação local. Chaves naturais, restrições únicas e operações condicionais também ajudam. O objetivo é proteger o efeito de negócio, não apenas impedir duas execuções de código.

A documentação de semânticas de entrega do Kafka mostra por que “exatamente uma vez” depende do limite analisado: gravar e processar dentro do Kafka é diferente de atualizar um ERP ou enviar um e-mail externo.

6. Evite o problema da gravação dupla

Um risco clássico ocorre quando a aplicação salva uma alteração no banco e, em seguida, publica o evento. Se o primeiro passo funcionar e o segundo falhar, o estado muda sem que os consumidores sejam avisados. Inverter a ordem também cria inconsistência.

O padrão transactional outbox grava a mudança de negócio e um registro de saída na mesma transação do banco. Um publicador separado encaminha os registros pendentes ao broker. A orientação da AWS sobre transactional outbox também ressalta ordenação e consumidores idempotentes.

Change Data Capture pode ser outra opção, sobretudo quando a origem não consegue publicar diretamente, mas exige governança sobre quais mudanças técnicas representam eventos de negócio.

7. Projete falhas, retentativas e quarentena

Retentativas devem usar espera progressiva, limite de tentativas e aleatoriedade para não amplificar uma indisponibilidade. Erros permanentes — campo inválido, versão incompatível ou referência inexistente — não melhoram com repetição infinita.

Depois do limite, envie a mensagem para uma fila de mensagens não processadas, preservando causa, tentativas e contexto seguro. Defina quem analisa, como corrige, quando reprocessa e como evita repetir efeitos já concluídos. Uma DLQ sem processo operacional é apenas um depósito de falhas.

8. Defina ordenação apenas onde importa

Ordenação global reduz paralelismo e eleva custo. Na maioria dos processos, basta preservar a sequência por entidade: eventos do mesmo pedido devem manter ordem, mas pedidos diferentes podem avançar em paralelo. Uma chave de partição bem escolhida ajuda a alcançar esse equilíbrio.

Ainda assim, consumidores devem validar versão ou estado atual, pois atrasos, reprocessamentos e origens distintas podem produzir eventos fora da sequência esperada.

Observabilidade para integrações assíncronas

Uma chamada síncrona oferece uma pilha de erro imediata. Em eventos, a jornada atravessa produtor, broker e diversos consumidores. Sem correlação, um pedido pode “sumir” entre filas sem que a equipe saiba onde investigar.

Acompanhe pelo menos:

  • taxa de publicação, consumo, sucesso e falha;
  • profundidade da fila e idade da mensagem mais antiga;
  • atraso do consumidor em relação ao stream;
  • quantidade de retentativas e mensagens em quarentena;
  • tempo do evento até a conclusão do efeito de negócio;
  • indisponibilidade e limitação de dependências;
  • versões de schema rejeitadas.

Propague correlation ID e contexto de trace sem colocar credenciais nos metadados. Relacione métricas técnicas a resultados, como pedidos pendentes de faturamento. O guia de observabilidade de sistemas detalha logs, métricas, traces, SLOs e alertas acionáveis.

Segurança e governança

Autentique produtores e consumidores e aplique menor privilégio por tópico ou fila. Criptografe o transporte e, quando o risco justificar, o conteúdo armazenado. Segredos não pertencem ao payload; dados pessoais devem ter finalidade, acesso e retenção definidos.

Mantenha inventário de eventos, responsáveis, consumidores, dependências e políticas de descarte. Audite alterações de permissão e proteja painéis operacionais, pois mensagens de erro podem revelar dados sensíveis. Em ambientes híbridos ou regulados, a página de governança e compliance de TI ajuda a conectar controles técnicos a riscos e evidências.

Um roteiro de adoção incremental

Escolha um único fluxo com dor mensurável: picos, falhas em cascata, espera desnecessária ou vários consumidores. Registre a linha de base e desenhe o caminho atual antes de adicionar mensageria.

Em seguida:

  1. defina evento, proprietário, consumidores e prazo;
  2. escolha fila, publicação/assinatura ou stream;
  3. crie contrato versionado e política de dados;
  4. implemente outbox ou outro mecanismo confiável de publicação;
  5. torne consumidores idempotentes;
  6. configure retentativas, quarentena e procedimento de reprocessamento;
  7. adicione métricas, traces, alertas e painel de negócio;
  8. teste indisponibilidade, duplicidade, atraso, ordem e mudança de schema;
  9. libere gradualmente e compare com a linha de base;
  10. documente custos, decisões e responsabilidades operacionais.

Para workloads em nuvem ou híbridos, capacidade, conectividade e recuperação também devem entrar no plano de cloud e infraestrutura.

Checklist para decidir

Antes de aprovar a solução, confirme:

  • existe mais de um consumidor ou necessidade real de desacoplamento;
  • o processo tolera consistência eventual;
  • o usuário consegue acompanhar o status;
  • a garantia de entrega foi definida;
  • duplicidades não produzem efeitos repetidos;
  • falhas de publicação não geram gravações órfãs;
  • contratos possuem versão e responsável;
  • dados sensíveis foram minimizados;
  • retentativas e quarentena têm limites e donos;
  • ordenação foi limitada à entidade necessária;
  • capacidade, retenção, custo e recuperação foram dimensionados;
  • a jornada é observável de ponta a ponta;
  • a equipe consegue operar a solução.

Conclusão

A arquitetura orientada a eventos cria valor quando transforma integrações frágeis em fluxos desacoplados, recuperáveis e observáveis. O resultado depende menos do nome do broker e mais de contratos claros, idempotência, publicação consistente, tratamento de falhas e responsabilidade operacional.

Comece por um processo relevante, compare com uma API ou job mais simples e adote eventos apenas quando os requisitos justificarem a complexidade. Se sua empresa precisa mapear integrações e escolher uma arquitetura proporcional ao risco, fale com a Mattos Tech Solutions.

Fontes e referências

Falar no WhatsApp