Event Sourcing
Event Sourcing é um padrão onde o estado da aplicação é derivado de uma sequência de eventos imutáveis. Ao invés de guardar só o estado atual, guardamos tudo que aconteceu.
O Extrato Bancário
Seu banco não guarda apenas o saldo atual — ele guarda cada depósito, saque e transferência. Se precisar saber como chegou naquele saldo, basta percorrer o extrato. Event Sourcing faz a mesma coisa com os dados da sua aplicação.
Eventos Imutáveis
Eventos são fatos que já aconteceram e nunca são alterados ou deletados. 'PedidoCriado', 'PagamentoAprovado', 'ItemAdicionado' — cada um registra o que mudou e quando.
Reconstrução de Estado
O estado atual é calculado aplicando todos os eventos na ordem em que aconteceram. É como rebobinar uma fita: do início até agora, cada evento transforma o estado passo a passo.
Carrinho de Compras com Eventos
Ao invés de guardar o carrinho como um objeto estático, registramos cada ação como evento. Para saber o estado atual, reaplicamos os eventos em ordem.
// Eventos do carrinho
const eventos = [
{ tipo: 'ItemAdicionado', produto: 'Camiseta', preco: 49.90 },
{ tipo: 'ItemAdicionado', produto: 'Calça', preco: 89.90 },
{ tipo: 'ItemRemovido', produto: 'Camiseta' },
{ tipo: 'CupomAplicado', desconto: 0.1 }
];
// Reconstruir estado atual
function reconstruirCarrinho(eventos) {
return eventos.reduce((carrinho, evento) => {
switch (evento.tipo) {
case 'ItemAdicionado':
return { ...carrinho, itens: [...carrinho.itens, evento] };
case 'ItemRemovido':
return { ...carrinho, itens: carrinho.itens.filter(i => i.produto !== evento.produto) };
case 'CupomAplicado':
return { ...carrinho, desconto: evento.desconto };
}
}, { itens: [], desconto: 0 });
}Audit Trail Completo
Com Event Sourcing você tem um histórico completo e auditável de tudo que aconteceu no sistema. Ideal para compliance, debugging e entender exatamente como o sistema chegou em determinado estado.
Histórico de Commits do Git
O Git é Event Sourcing na prática: cada commit é um evento imutável. Você pode voltar para qualquer ponto no tempo, ver o que mudou e reconstruir o estado do código em qualquer momento.