Event Sourcing é um padrão arquitetural onde todas as mudanças no estado de uma aplicação são armazenadas como uma sequência de eventos imutáveis. Em vez de persistir apenas o estado atual dos dados, o Event Sourcing mantém um registro completo de todos os eventos que levaram ao estado atual.
Conceitos Fundamentais
1. Eventos
Os eventos representam fatos que aconteceram no passado e são imutáveis.
Cada evento contém:
- Timestamp: quando o evento ocorreu
- Tipo: que tipo de evento é
- Dados: informações específicas do evento
- Metadata: informações adicionais (usuário, versão, etc.)
Exemplo:
{
"eventId": "uuid-123",
"eventType": "ContaCriada",
"timestamp": "2024-01-15T10:30:00Z",
"aggregateId": "conta-456",
"data": {
"numeroConta": "12345-6",
"titular": "João Silva",
"saldoInicial": 1000.00
},
"version": 1
}
Mas como ele funciona?
- Comando é recebido pela aplicação
- Aggregate processa o comando
- Eventos são gerados como resultado
- Eventos são persistidos no Event Store
- Projeções são atualizadas com base nos novos eventos
Exemplo Prático - Sistema Bancário:
Estado Inicial: Conta não existe
Eventos:
1. ContaCriada { numeroConta: "12345", saldo: 1000 }
2. DepositoRealizado { valor: 500 }
3. SaqueRealizado { valor: 200 }
4. DepositoRealizado { valor: 100 }
Estado Final: Conta "12345" com saldo de 1400
Vantagens
1. Auditoria Completa
- Histórico completo de todas as mudanças
- Capacidade de responder "como chegamos aqui?"
- Conformidade regulatória facilitada
2. Reconstrução de Estado
- Estado pode ser reconstruído a qualquer momento
- Possibilidade de "time travel" para qualquer ponto no tempo
- Debugging e análise histórica simplificados
3. Flexibilidade
- Múltiplas projeções do mesmo conjunto de eventos
- Adição de novas funcionalidades sem migração de dados
- Suporte a diferentes modelos de leitura
4. Escalabilidade
- Separação entre escrita (eventos) e leitura (projeções)
- Otimização independente para cada caso de uso
- Paralelização de processamento
5. Integração
- Eventos podem ser publicados para outros sistemas
- Base natural para arquiteturas orientadas a eventos
- Facilita a implementação de CQRS
Desvantagens
1. Complexidade
- Curva de aprendizado íngreme
- Maior complexidade conceitual
- Necessidade de gerenciar versionamento de eventos
2. Performance de Leitura
- Reconstrução de estado pode ser lenta
- Necessidade de snapshots para agregados grandes
- Complexidade adicional nas consultas
3. Armazenamento
- Crescimento contínuo do volume de dados
- Necessidade de estratégias de arquivo/limpeza
- Maior uso de espaço em disco
4. Eventual Consistency
- Projeções podem estar temporariamente desatualizadas
- Necessidade de lidar com inconsistências temporárias
- Complexidade adicional na UI
Top comments (0)