Arquitetura Orientada a Eventos
Definição
A Arquitetura Orientada a Eventos (Event-Driven Architecture) é um modelo arquitetural baseado na emissão, detecção e reação a eventos. Em vez de chamadas diretas entre componentes, os sistemas se comunicam de forma indireta, por meio de eventos transmitidos e processados de forma assíncrona.
Um evento é uma notificação de que algo aconteceu — por exemplo, "pedido criado" ou "pagamento aprovado". Outros componentes podem escutar e reagir a esses eventos sem que o emissor precise conhecer os receptores.
Por que é importante
Essa arquitetura é especialmente útil em sistemas distribuídos, aplicações escaláveis e ambientes com alto volume de interações. Ela promove baixo acoplamento entre os componentes e oferece flexibilidade para evolução do sistema.
Também facilita a construção de fluxos assíncronos, permite o uso de event sourcing e melhora a capacidade de auditabilidade e rastreabilidade de ações.
Estrutura típica
Um sistema orientado a eventos geralmente envolve três papéis principais:
- Emissor de Evento (Producer): gera um evento quando algo relevante acontece.
- Canal de Mensagens: meio pelo qual os eventos são transmitidos (como fila, barramento ou tópico de mensageria).
- Consumidor de Evento (Listener/Handler): recebe o evento e executa uma ação com base nele.
[ Componente A ]
└─ Evento: "Pedido Criado"
↓
[ Fila / Tópico / Barramento ]
↓
[ Componente B ] [ Componente C ]
(envia e-mail) (atualiza estoque)
Como os componentes são desacoplados, é possível adicionar ou remover consumidores sem alterar o emissor.
Exemplo de aplicação
Um sistema de e-commerce pode funcionar assim:
- Quando um pedido é criado, o sistema emite um evento
PedidoCriado
. - O serviço de notificação escuta esse evento e envia um e-mail ao cliente.
- O serviço de logística escuta o mesmo evento e inicia a separação dos produtos.
- Nenhum desses serviços conhece os outros diretamente.
Exemplo prático (em Python)
Simulando o fluxo de eventos sem infraestrutura real de mensageria:
# Barramento de eventos simples
class EventBus:
def __init__(self):
self.assinantes = {}
def registrar(self, evento, callback):
self.assinantes.setdefault(evento, []).append(callback)
def emitir(self, evento, dados):
for callback in self.assinantes.get(evento, []):
callback(dados)
# Serviços consumidores
def enviar_email(dados):
print(f"[Email] Enviado para {dados['cliente']} sobre o pedido #{dados['id']}")
def atualizar_estoque(dados):
print(f"[Estoque] Produtos do pedido #{dados['id']} separados")
# Simulando a emissão
eventos = EventBus()
eventos.registrar("PedidoCriado", enviar_email)
eventos.registrar("PedidoCriado", atualizar_estoque)
# Emissor
eventos.emitir("PedidoCriado", {"id": 101, "cliente": "Alice"})
Aqui, o componente que emite o evento não conhece os consumidores. Novos comportamentos podem ser adicionados registrando funções sem modificar o código existente.