Voltar para Blog

Event Sourcing: Armazenando Estado como Sequência de Eventos

Renan Ribeiro
Arquitetura

Event Sourcing é um padrão arquitetural onde, em vez de armazenar apenas o estado atual dos dados, você armazena uma sequência de eventos que levaram a esse estado.

Cada mudança no sistema é capturada como um evento imutável, permitindo reconstruir o estado a qualquer momento reproduzindo os eventos.

Conceitos Fundamentais

Evento: Representa algo que aconteceu no passado. Sempre nomeado em tempo passado (past tense). Exemplos: PedidoCriado, ItemAdicionado, PagamentoProcessado.

Event Store: Banco de dados append-only que armazena todos os eventos em ordem cronológica. Pode ser implementado com EventStoreDB, PostgreSQL ou até Kafka.

Projeções: Views materializadas do estado atual, reconstruídas a partir dos eventos. Otimizadas para consultas específicas.

Comparação: CRUD vs Event Sourcing

No modelo tradicional CRUD, você executa UPDATE e perde o histórico. Impossível auditar ou fazer rollback preciso.

Com Event Sourcing, você tem histórico completo preservado, auditoria natural e pode reconstruir estado em qualquer ponto no tempo.

Exemplo Prático: Conta Bancária

Imagine uma conta com eventos: ContaAberta (R$ 1000), DepositoRealizado (R$ 500), SaqueRealizado (R$ 100).

Para saber o saldo atual, você reproduz os eventos: 1000 + 500 - 100 = R$ 1400. Simples e auditável.

Vantagens

Auditoria Completa: Todo histórico é mantido naturalmente. Perfeito para compliance e regulamentações financeiras ou de saúde.

Debug Temporal: Pode reproduzir bugs reconstruindo o estado no momento exato do erro. Invaluável para diagnóstico.

Event Replay: Permite criar novas projeções a partir de eventos históricos sem migração de dados.

Análise de Negócio: Dados ricos para análise de comportamento, tendências e machine learning.

Desafios

Complexidade: Curva de aprendizado íngreme. Requer mudança de mentalidade da equipe.

Consultas: Queries complexas exigem projeções bem planejadas. Não é trivial fazer JOIN de eventos.

Evolução de Schema: Eventos são imutáveis. Mudanças requerem versionamento cuidadoso ou upcasting.

Snapshots: Para agregados com muitos eventos, snapshots periódicos são necessários para performance.

Quando Usar

Use quando auditoria é crítica (financeiro, saúde), histórico completo é valioso, análise temporal é importante, ou em sistemas distribuídos com eventual consistency.

Evite quando sistema é CRUD simples, consultas complexas em tempo real são necessárias, time não tem experiência, ou não há necessidade de histórico.

Implementação

A estrutura básica envolve um Event Store com métodos append (escrever) e getEvents (ler). O agregado aplica eventos sequencialmente para reconstruir estado.

Use snapshots a cada N eventos para otimizar. Combine com CQRS para separar escrita (eventos) de leitura (projeções).

Ferramentas

EventStoreDB é um database especializado. Apache Kafka funciona bem para event streaming. Axon Framework para Java/Spring, NEventStore para .NET, e até PostgreSQL pode ser usado como event store.

Conclusão

Event Sourcing é poderoso mas não é bala de prata. Use quando o histórico completo e auditoria são essenciais para o negócio.

Combine com CQRS para máxima efetividade. Comece pequeno, com agregados específicos, antes de aplicar no sistema inteiro.