Event Sourcing: CDC vs. Outbox Pattern

Principais Pontos
  • CDC captura mudanças diretamente do transaction log do banco, evitando modificações no código da aplicação mas criando dependência de ferramentas especializadas como Debezium.
  • Outbox Pattern garante consistência forte ao salvar operação e evento na mesma transação, eliminando inconsistências mas aumentando o overhead transacional.
  • A escolha entre CDC e Outbox depende do contexto: sistemas legados favorecem CDC, enquanto aplicações novas com requisitos de consistência forte se beneficiam do Outbox.
  • Implementações híbridas podem usar Outbox para operações críticas e CDC para dados auxiliares, combinando benefícios de ambas as abordagens.
  • O verdadeiro desafio está em capturar o contexto de negócio: CDC perde informações sobre a intenção da operação, enquanto Outbox permite enriquecer eventos com dados contextuais.

Event sourcing é um padrão de arquitetura que captura todas as mudanças de estado de uma aplicação como uma sequência de eventos imutáveis. Em vez de armazenar apenas o estado atual, mantemos um log completo de todas as mudanças que ocorreram ao longo do tempo.

Quando implementamos event sourcing, uma das principais decisões arquiteturais que enfrentamos é: como capturar e publicar esses eventos de forma confiável? Duas abordagens se destacam: Change Data Capture (CDC) e Outbox Pattern.

Change Data Capture (CDC): Monitoramento Inteligente

O CDC monitora as mudanças no banco de dados e as transforma em eventos. É como ter um observador silencioso que registra tudo que acontece, sem interferir no funcionamento normal da aplicação.

Como Funciona o CDC

  1. Monitoramento: Uma ferramenta externa monitora o transaction log do banco de dados
  2. Captura: Detecta mudanças (INSERT, UPDATE, DELETE) em tempo real
  3. Transformação: Converte essas mudanças em eventos estruturados
  4. Publicação: Envia os eventos para um message broker (Kafka, RabbitMQ, etc.)

Vantagens do CDC

✅ Abordagem Não-Intrusiva

  • Não requer modificações no código da aplicação
  • Funciona com sistemas legados sem refatoração
  • Baixo acoplamento entre captura de eventos e lógica de negócio

✅ Captura Abrangente

  • Monitora todas as mudanças, mesmo as feitas diretamente no banco
  • Não perde eventos por falhas de aplicação
  • Garante que nenhuma mudança passa despercebida

✅ Performance

  • Overhead mínimo na aplicação principal
  • Processamento assíncrono dos eventos
  • Não impacta transações críticas

Desvantagens do CDC

❌ Complexidade de Infraestrutura

  • Requer ferramentas especializadas (Debezium, Maxwell, etc.)
  • Configuração e manutenção mais complexas
  • Dependência de ferramentas externas

❌ Consistência Eventual

  • Pequeno delay entre mudança e publicação do evento
  • Não garante ordem exata em cenários de alta concorrência
  • Possíveis duplicações em cenários de falha

❌ Limitações de Contexto

  • Eventos baseados apenas em mudanças de dados
  • Perda de contexto de negócio
  • Dificuldade para capturar intenção da operação

Outbox Pattern: Controle Total na Aplicação

O Outbox Pattern implementa a captura de eventos diretamente na aplicação, usando uma tabela especial (outbox) para armazenar eventos que serão publicados posteriormente.

Como Funciona o Outbox Pattern

  1. Transação Unificada: Dentro de uma transação de banco, a aplicação:
    • Executa a operação de negócio
    • Insere o evento correspondente na tabela outbox
  2. Publicação: Um processo separado lê a tabela outbox e publica os eventos
  3. Cleanup: Remove eventos já publicados com sucesso

Vantagens do Outbox Pattern

✅ Consistência Forte

  • Operação e evento são salvos na mesma transação
  • Garante que eventos são gerados apenas para operações bem-sucedidas
  • Ordem de eventos preservada por design

✅ Controle Total

  • Aplicação define exatamente quais eventos gerar
  • Rico contexto de negócio nos eventos
  • Flexibilidade para enriquecer eventos com informações adicionais

✅ Simplicidade Conceitual

  • Padrão direto de implementar
  • Não requer ferramentas externas complexas
  • Fácil de testar e debugar

Desvantagens do Outbox Pattern

❌ Modificação de Código

  • Requer mudanças na aplicação existente
  • Acoplamento entre lógica de negócio e geração de eventos
  • Mais código para manter

❌ Overhead de Transação

  • Cada operação de negócio inclui escrita na tabela outbox
  • Possível impacto na performance de transações
  • Aumenta o tamanho das transações

❌ Complexidade de Publicação

  • Precisa implementar ou usar um event publisher confiável
  • Gerenciamento de retry e fallback
  • Riscos de duplicação se não implementado corretamente

Comparação Prática: Quando Usar Cada Abordagem

Use CDC quando:

  • Sistema legado: Você tem uma aplicação existente que não pode ser facilmente modificada
  • Múltiplas aplicações: Várias aplicações escrevem no mesmo banco de dados
  • Prioridade na performance: Overhead de transação é crítico
  • Equipe de infraestrutura forte: Tem expertise para configurar e manter ferramentas de CDC

Use Outbox Pattern quando:

  • Controle é importante: Você quer controle total sobre quais eventos são gerados
  • Contexto rico: Eventos precisam de informações que não estão no banco
  • Consistência forte: Não pode aceitar nenhuma inconsistência entre operação e evento
  • Aplicação nova: Está desenvolvendo um sistema do zero

Implementação Híbrida: O Melhor dos Dois Mundos

Em muitos casos, você pode combinar ambas as abordagens:

┌─────────────────┐    ┌─────────────────┐
│   Operações     │    │   Mudanças      │
│   Críticas      │    │   Auxiliares    │
│                 │    │                 │
│ Outbox Pattern  │    │      CDC        │
└─────────────────┘    └─────────────────┘
         │                       │
         └───────┬───────────────┘
                 │
         ┌─────────────────┐
         │  Event Stream   │
         │   Unificado     │
         └─────────────────┘

Estratégia Híbrida

  1. Outbox para eventos críticos: Use Outbox Pattern para operações de negócio importantes onde consistência é fundamental
  2. CDC para dados auxiliares: Use CDC para capturar mudanças em tabelas de suporte, logs, auditoria
  3. Stream unificado: Combine ambos os streams em um único event stream ordenado

Ferramentas e Tecnologias

Para CDC:

  • Debezium: Plataforma open-source para CDC com suporte a múltiplos bancos
  • AWS DMS: Serviço gerenciado da AWS para migração e replicação de dados
  • Maxwell: CDC para MySQL com foco em simplicidade
  • Kafka Connect: Connectors para integração CDC com Apache Kafka

Para Outbox Pattern:

  • Transactional Outbox: Implementações em frameworks como Spring Boot
  • Axon Framework: Framework para CQRS/Event Sourcing com Outbox integrado
  • NServiceBus: Plataforma .NET com suporte nativo ao Outbox Pattern

Considerações de Performance

CDC Performance:

  • Prós: Baixo impacto na aplicação principal
  • Contras: Possível sobrecarga no banco de dados para log parsing

Outbox Performance:

  • Prós: Controle fino sobre quando e como eventos são gerados
  • Contras: Overhead adicional em cada transação de negócio

Conclusão: Escolhendo a Abordagem Certa

Não existe uma resposta única. A escolha entre CDC e Outbox Pattern depende do seu contexto específico:

Para sistemas legados com múltiplas aplicações: CDC oferece uma solução não-intrusiva que pode ser implementada sem grandes refatorações.

Para novos sistemas com requisitos rigorosos de consistência: Outbox Pattern fornece controle total e garante que eventos sejam gerados apenas para operações bem-sucedidas.

Para sistemas complexos: Uma abordagem híbrida pode aproveitar os benefícios de ambos os padrões.

Princípios para a Decisão:

  1. Avalie o contexto atual: Quanto você pode modificar a aplicação existente?
  2. Considere os requisitos de consistência: Você pode aceitar consistência eventual?
  3. Analise a capacidade da equipe: Qual abordagem sua equipe consegue implementar e manter melhor?
  4. Pense na evolução: Como a solução vai escalar e evoluir com o tempo?
Insight

"Event sourcing é uma jornada, não um destino."

Event sourcing é uma jornada, não um destino. Comece com a abordagem que faz mais sentido para seu contexto atual e evolua conforme necessário. O importante é capturar os eventos que representam a história do seu negócio de forma confiável e útil.


Referências