Descrição: Entenda o que é Event-Driven Architecture (EDA), por que ela se tornou padrão em sistemas distribuídos modernos e como serviços de manutenção, ordens de serviço e outros domínios de um mesmo produto conseguem reagir a mudanças em tempo real sem ficarem fortemente acoplados uns aos outros.
Em sistemas monolíticos, é comum que um serviço chame outro diretamente: o módulo de pedidos chama o módulo de estoque, que chama o módulo de notificação, e assim por diante. Isso funciona até o sistema crescer. Quando várias equipes passam a operar serviços independentes — pedidos, manutenção, ordens de serviço, notificações — chamadas diretas via API síncrona criam um emaranhado de dependências: se um serviço cai, os outros travam junto.
A Arquitetura Orientada a Eventos (Event-Driven Architecture, ou EDA) resolve esse problema invertendo a lógica de comunicação: em vez de um serviço pedir algo a outro, ele apenas anuncia que algo aconteceu. Quem tiver interesse, reage. Quem não tiver, ignora. Nenhum dos dois lados precisa conhecer o outro.
Toda arquitetura orientada a eventos gira em torno de três conceitos:
Producer (produtor): o serviço que gera o evento. Por exemplo, o serviço de pedidos
publica um evento OrderCreated assim que um pedido é confirmado.
Event Bus / Broker: a infraestrutura de mensageria (Kafka, RabbitMQ, AWS SQS/SNS, Azure Service Bus) responsável por receber, armazenar e distribuir os eventos de forma confiável.
Consumer (consumidor): qualquer serviço que se inscreve para receber determinados eventos e reage a eles de forma independente — sem que o produtor precise saber quem são os consumidores nem quantos existem.
Imagine um sistema logístico em que um equipamento reporta uma falha. O fluxo orientado a eventos poderia funcionar assim:
1. sensor.event -> "EquipmentFailureDetected" (asset: esteira-07)
2. maintenance-svc -> consome o evento e cria uma Ordem de Serviço
3. service-order-svc -> publica "ServiceOrderCreated" (id: 4471)
4. notification-svc -> consome o evento e avisa o time de campo
5. analytics-svc -> consome o mesmo evento e atualiza o dashboard
Note que o serviço que detectou a falha não sabe nada sobre notificações ou analytics — ele só publicou um evento. Cada novo consumidor pode ser adicionado sem alterar uma linha sequer do produtor. É esse desacoplamento que torna a EDA tão atraente para domínios como manutenção e logística, onde o mesmo fato (uma falha, uma OS aberta, um status alterado) interessa a várias áreas ao mesmo tempo.
Em um ecossistema Java/Spring, publicar um evento de domínio costuma ser simples. Um exemplo simplificado
usando ApplicationEventPublisher (eventos internos) ou um produtor Kafka (eventos entre
serviços):
@Service
public class ServiceOrderService {
private final KafkaTemplate<String, ServiceOrderCreatedEvent> kafkaTemplate;
public ServiceOrder open(ServiceOrderRequest request) {
ServiceOrder order = repository.save(ServiceOrder.from(request));
kafkaTemplate.send("service-orders.events",
new ServiceOrderCreatedEvent(order.getId(), order.getAssetId(), order.getStatus()));
return order;
}
}
O serviço de ordens de serviço não precisa saber que existe um serviço de notificações ouvindo o tópico
service-orders.events. Ele só garante que, sempre que uma OS for aberta, o fato fica
registrado e disponível para quem quiser reagir a ele.
Publish/Subscribe: um evento pode ter múltiplos consumidores independentes, cada um reagindo à sua maneira — é o padrão mais usado no dia a dia.
Event Sourcing: em vez de guardar apenas o estado atual de uma entidade, o sistema guarda a sequência completa de eventos que a levou até ali. O estado é reconstruído replayando o histórico — muito útil para auditoria de ordens de serviço, por exemplo.
CQRS (Command Query Responsibility Segregation): separa o modelo usado para escrever dados do modelo usado para consultá-los, frequentemente combinado com eventos para manter os dois sincronizados.
Baixo acoplamento: produtores e consumidores evoluem de forma independente.
Escalabilidade: novos consumidores podem ser plugados sem tocar no serviço original.
Resiliência: se um consumidor cair, o broker mantém a mensagem até que ele volte a processar (dependendo da configuração de retenção e acknowledgment).
Rastreabilidade: o histórico de eventos funciona como uma trilha de auditoria natural — essencial em sistemas de manutenção, onde é preciso saber exatamente quando cada status mudou.
Consistência eventual: como a comunicação é assíncrona, existe uma janela de tempo em que diferentes partes do sistema podem estar "desatualizadas" entre si. Nem toda funcionalidade tolera isso.
Idempotência: um evento pode, em cenários de falha, ser entregue mais de uma vez. Os consumidores precisam ser escritos para lidar com isso sem duplicar efeitos colaterais (como abrir a mesma OS duas vezes).
Observabilidade: depurar um fluxo que passa por cinco serviços diferentes exige correlação de logs, tracing distribuído e boas práticas de nomeação de eventos — sem isso, debugar vira um pesadelo.
A Arquitetura Orientada a Eventos não é a solução para todos os problemas, mas é uma ferramenta poderosa quando múltiplos serviços independentes precisam reagir aos mesmos fatos de negócio sem ficarem presos uns aos outros. Em domínios como logística — onde uma única mudança de status pode interessar à manutenção, ao time de campo, ao financeiro e ao analytics ao mesmo tempo — pensar em eventos, e não em chamadas diretas, costuma ser o que separa um sistema que escala de um que trava toda vez que uma peça do sistema fica fora do ar.