Event Sourcing: CDC vs. Outbox Pattern
- 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
- Monitoramento: Uma ferramenta externa monitora o transaction log do banco de dados
- Captura: Detecta mudanças (INSERT, UPDATE, DELETE) em tempo real
- Transformação: Converte essas mudanças em eventos estruturados
- 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
- 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
- Publicação: Um processo separado lê a tabela outbox e publica os eventos
- 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
- Outbox para eventos críticos: Use Outbox Pattern para operações de negócio importantes onde consistência é fundamental
- CDC para dados auxiliares: Use CDC para capturar mudanças em tabelas de suporte, logs, auditoria
- 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:
- Avalie o contexto atual: Quanto você pode modificar a aplicação existente?
- Considere os requisitos de consistência: Você pode aceitar consistência eventual?
- Analise a capacidade da equipe: Qual abordagem sua equipe consegue implementar e manter melhor?
- Pense na evolução: Como a solução vai escalar e evoluir com o tempo?
"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.