DEV Community

Thiago da Silva Adriano
Thiago da Silva Adriano

Posted on

Introdução ao Event Sourcing

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
}
Enter fullscreen mode Exit fullscreen mode

Mas como ele funciona?

  1. Comando é recebido pela aplicação
  2. Aggregate processa o comando
  3. Eventos são gerados como resultado
  4. Eventos são persistidos no Event Store
  5. 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
Enter fullscreen mode Exit fullscreen mode

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)