Desenvolvimento Web

Event-Driven Architecture: Como Construir Sistemas Reativos e Desacoplados

Event-Driven Architecture: Como Construir Sistemas Reativos e Desacoplados

Event-Driven Architecture (EDA) e um padrao arquitetural onde componentes se comunicam atraves de eventos em vez de chamadas diretas. Quando algo acontece (um pedido e criado, um pagamento e confirmado, um usuario se cadastra), um evento e emitido e qualquer componente interessado pode reagir a ele. Em 2026, EDA e fundamental para microservicos e sistemas distribuidos.

O problema com comunicacao sincrona

Na arquitetura tradicional, servicos chamam uns aos outros diretamente via HTTP. Quando o servico de pedidos cria um pedido, ele chama o servico de pagamentos, que chama o servico de estoque, que chama o servico de notificacao. Problemas: acoplamento forte (o servico de pedidos precisa conhecer todos os outros), cascata de falhas (se o servico de notificacao estiver fora do ar, o pedido inteiro falha), latencia acumulada (cada chamada adiciona latencia), e dificuldade de adicionar novos comportamentos (novo servico = mudar o servico de pedidos).

Como EDA resolve

Com eventos: o servico de pedidos cria o pedido e emite um evento PedidoCriado. Qualquer servico interessado escuta esse evento: o de pagamento processa o pagamento, o de estoque reserva os itens, o de notificacao envia email. Nenhum servico conhece os outros. Adicionar um novo comportamento (ex: analytics) e so criar um novo consumer do evento, sem tocar no servico de pedidos.

Conceitos fundamentais

Evento: registro imutavel de algo que aconteceu. Tem timestamp, tipo e payload. Exemplo: PedidoCriado com id do pedido, itens, valor, cliente.

Producer: componente que emite eventos. Consumer: componente que reage a eventos. Event Broker: infraestrutura que recebe eventos e os entrega aos consumers. Kafka, RabbitMQ, Amazon SNS+SQS sao brokers comuns.

Tipos de eventos

Domain Event: algo significativo no dominio de negocio. PedidoCriado, PagamentoConfirmado, UsuarioCadastrado. Carrega dados relevantes.

Integration Event: evento para comunicacao entre servicos/bounded contexts diferentes. Geralmente mais generico e estavel na estrutura.

Event Notification: evento leve que apenas notifica que algo aconteceu, sem carregar todos os dados. O consumer consulta a fonte para detalhes.

Patterns de EDA

Event Sourcing

Em vez de armazenar o estado atual de uma entidade, armazena todos os eventos que aconteceram. O estado atual e reconstruido reproduzindo os eventos na sequencia.

Exemplo: conta bancaria. Em vez de armazenar saldo = R$ 1000, armazena: ContaCriada(saldo_inicial=0), DepositoRealizado(valor=500), DepositoRealizado(valor=800), SaqueRealizado(valor=300). O saldo atual (R$ 1000) e calculado somando os eventos.

Vantagens: audit trail completo (compliance), time travel (ver estado em qualquer momento do passado), debugging (reproduzir exatamente o que aconteceu). Desvantagens: complexidade, event store pode ficar enorme, queries complexas sao mais dificeis.

CQRS (Command Query Responsibility Segregation)

Separa o modelo de escrita (commands) do modelo de leitura (queries). Escritas usam o modelo de dominio completo (Event Sourcing, por exemplo). Leituras usam views otimizadas para cada caso de uso (materialized views, modelos desnormalizados).

Isso permite escalar leitura e escrita independentemente e otimizar cada lado para seu caso de uso.

Saga Pattern

Coordena transacoes distribuidas entre multiplos servicos sem transacoes ACID distribuidas. Cada step da saga executa uma acao local e emite um evento. Se um step falha, compensacoes sao executadas para desfazer os steps anteriores.

Exemplo: criar pedido (Servico de Pedidos: cria pedido, emite PedidoCriado). Reservar estoque (Servico de Estoque: escuta PedidoCriado, reserva itens, emite EstoqueReservado). Processar pagamento (Servico de Pagamentos: escuta EstoqueReservado, cobra cartao, emite PagamentoConfirmado). Confirmar pedido (Servico de Pedidos: escuta PagamentoConfirmado, confirma pedido).

Se o pagamento falha: emite PagamentoFalhado, Servico de Estoque escuta e libera a reserva, Servico de Pedidos escuta e cancela o pedido.

Implementacao com Node.js e RabbitMQ

// Producer – servico de pedidos
const amqp = require(“amqplib”);

async function emitirEvento(exchange, tipo, payload) {
const conn = await amqp.connect(“amqp://localhost”);
const channel = await conn.createChannel();
await channel.assertExchange(exchange, “topic”, { durable: true });

const evento = {
tipo: tipo,
timestamp: new Date().toISOString(),
payload: payload,
};

channel.publish(exchange, tipo, Buffer.from(JSON.stringify(evento)));
}

// Ao criar pedido:
await emitirEvento(“pedidos”, “pedido.criado”, {
pedido_id: “abc123”,
itens: [{ produto: “Notebook”, qtd: 1, valor: 4500 }],
cliente_id: “user_456”,
valor_total: 4500,
});

Desafios e cuidados

Consistencia eventual: em EDA, os dados nao sao consistentes imediatamente entre servicos. O estoque pode levar alguns segundos para refletir a venda. Para a maioria dos casos, isso e aceitavel. Para casos criticos (saldo bancario), estrategias adicionais sao necessarias.

Idempotencia: eventos podem ser entregues mais de uma vez. Cada consumer deve ser idempotente — processar o mesmo evento duas vezes deve ter o mesmo resultado que processar uma vez.

Ordenacao: em sistemas distribuidos, a ordem de chegada dos eventos pode diferir da ordem de emissao. Use event versioning e sequence numbers quando a ordem importa.

Tem um projeto em mente?

Somos especialistas em transformar ideias em produtos digitais. Apps, sites, automações e IA — vamos construir juntos.

Resposta rápida Orçamento sem compromisso +100 projetos entregues
Compartilhar: