Globalcode – Open4education
Event Sourcing
Organizando seu Domínio em uma cadeia de Eventos
Pedro Góes
Trilha – Arquitetura .NET
Globalcode – Open4education
Agenda
Event Sourcing
Conceito
Exemplo de Problema
Funcionamento
Event Sourcing + CQRS
Projections
Globalcode – Open4education
Conceito
Entidade
Comando()
AlteraEstado()
Produto
Id: 10
Modelo: Caneta
Preço: R$ 14,00
Estoque: 9
Globalcode – Open4education
Conceito
Entidade
Comando()
AlteraEstado()
Produto
Id: 10
Modelo: Caneta
Preço: R$ 14,00
Estoque: 9
Produto Criado
Id: 10
Id: 10
Modelo: Caneta
Renomeado
Id: 10
Preço: R$ 9,00
Preço Alterado
Id: 10
Quantidade: 15
Estoque Recebido
Id: 10
Preço: R$ 14,00
Preço Alterado
Id: 10
Quantidade: 6
Peças Vendidas
Globalcode – Open4education
Conceito
Entidade
Comando()
Evento
Novo()
RegistraEvento()
ProcessaEvento()
Produto
Id: 10
Modelo: Caneta
Preço: R$ 14,00
Estoque: 9
Produto Criado
Id: 10
Id: 10
Modelo: Caneta
Renomeado
Id: 10
Preço: R$ 9,00
Preço Alterado
Id: 10
Quantidade: 15
Estoque Recebido
Id: 10
Preço: R$ 14,00
Preço Alterado
Id: 10
Quantidade: 6
Peças Vendidas
Globalcode – Open4education
O Problema de “Memória”
Um exemplo…
Globalcode – Open4education
O Problema de “Memória”
Um exemplo…
E se o custo do
Produto for
atualizado entre o
Bloqueio e a
Análise?
Globalcode – Open4education
O Problema de “Memória”
Id Custo Preço Venda
2 10.00 14.00
Id Pedido Produto Qtd Preço
10 1 2 3 12.32
12% de Desconto
Tabela de Produtos
Tabela de Itens de Pedido
Globalcode – Open4education
O Problema de “Memória”
Id Pedido Produto Qtd Preço
10 1 2 3 12.32
12% de Desconto
Id Custo Preço Venda
2 13.00 18.20
Tabela de Produtos
Tabela de Itens de Pedido
Globalcode – Open4education
O Problema de “Memória”
Id Pedido Produto Qtd Preço
10 1 2 3 12.32
Id Custo Preço Venda
2 13.00 18.20
32% de Desconto
Tabela de Produtos
Tabela de Itens de Pedido
Globalcode – Open4education
O Problema de “Memória”
Produto
Id: 2
Modelo: Caneta
Preço: R$ 18,20
Estoque: 12
Produto Criado
Id: 2
Id: 2
Modelo: Caneta
Renomeado
Id: 2
Preço: R$ 14,00
Preço Alterado
Id: 2
Quantidade: 15
Estoque Recebido
Id: 2
Preço: R$ 18,20
Preço Alterado
Id: 2
Quantidade: 3
Peças Vendidas
Pedido
Id: 1
Itens: { array }
Total: R$ 36,96Pedido Criado
Id: 1
Id: 1
Produto: 2
Quantidade: 3
Desconto: 12%
Item Adicionado
Tempo
Globalcode – Open4education
O Problema de “Memória”
Compreensão de Computações Passadas
Debugging de Código em Produção
Geração de Relatórios e Estatísticas
Globalcode – Open4education
O Problema de “Memória”
Logs
São desacoplados do código
Não traduzem para um estado do Sistema
Não são user-friendly
Alterar código
Previsão x Reação
Globalcode – Open4education
Event Sourcing
Entidade
Comando()
Evento
Novo()
RegistraEvento()
ProcessaEvento()
Globalcode – Open4education
Eventos?
Produto Pedido
Renomeado
Preço
Alterado
Estoque
Adicionado
Criado
Item
Adicionado
Faturado
Enviado
Globalcode – Open4education
Event Streams
Globalcode – Open4education
Event Streams
Eventos antigos nunca são alterados
EventoEventoEventoEvento
Globalcode – Open4education
Event Streams
Eventos antigos nunca são alterados
Eventos novos são inseridos no final
Evento EventoEventoEventoEvento
Globalcode – Open4education
Event Streams
Eventos antigos nunca são alterados
Eventos novos são inseridos no final
Enganos são corrigidos com Eventos de compensação
Evento EventoEventoEventoEvento Evento
Val: +10
Evento
Val: -10
Globalcode – Open4education
Reconstruindo...
A = 10 B = 15 A = 12 C = 50 B = 14 A = 18
Globalcode – Open4education
Reconstruindo...
A = 10 B = 15 A = 12 C = 50 B = 14 A = 18
Entidade
A: 18
B: 14
C: 50
Globalcode – Open4education
Reconstruindo...
A = 10 B = 15 A = 12 C = 50 B = 14 A = 18
Entidade
A: 18
B: 14
C: 50
Globalcode – Open4education
Reconstruindo...
A = 10 B = 15 A = 12 C = 50 B = 14 A = 18
Entidade
A: 12
B: 15
C: 50
Globalcode – Open4education
Snapshots
EntidadeEvento Evento Evento Evento Evento Evento Evento Evento
Globalcode – Open4education
Snapshots
EntidadeEvento Evento Evento Evento Evento Evento Evento Evento
Globalcode – Open4education
Snapshots
EntidadeEvento Evento Evento Evento Evento Evento Evento EventoSnapshot
Globalcode – Open4education
Snapshots
EntidadeEvento Evento Evento Evento Evento Evento Evento EventoSnapshot
Globalcode – Open4education
Snapshots
EntidadeEvento Evento Evento Evento Evento Evento Evento EventoSnapshot SnapshotSnapshot
Globalcode – Open4education
Resumindo...
Globalcode – Open4education
Organizando Streams
Eventos
P1 P2 C1 P2 C1 C2 P1 P1 P2 C2
Produto
Cliente
Pedido
Globalcode – Open4education
Organizando Streams
Produto
Cliente
Pedido
P1 P2 P2 P1
C1 C1 C2 C2
P1 P2
Produtos
Clientes
Pedidos
Globalcode – Open4education
Organizando Streams
Produto
Cliente
Cliente-1
C1 C1
Cliente-2
C2 C2
Produto-2
P2 P2
Produto-1
P1 P1
Globalcode – Open4education
Vantagens
Debug de Sistemas em Produção
Compreensão da Evolução do Estado
Queries Temporais
Geração de Relatórios e Estatísticas
Globalcode – Open4education
Vantagens
Não afeta a interface dos objetos
Globalcode – Open4education
CQRS
Objeto
Comando()
Consulta()
Globalcode – Open4education
CQRS
Objeto
Comando()
Consulta()
Objeto
Globalcode – Open4education
CQRS
Objeto
Comando()
Consulta()
Objeto
Objeto Consulta()
Objeto Consulta()
Globalcode – Open4education
CQRS
Objeto
Comando()
Consulta()
Objeto
Objeto Consulta()
Objeto Consulta()
Globalcode – Open4education
CQRS + Event Sourcing
Comando()
Objeto
Globalcode – Open4education
CQRS + Event Sourcing
Comando()
Objeto E E E E
Globalcode – Open4education
CQRS + Event Sourcing
Objeto
Comando()
Consulta()
Objeto
Objeto Consulta()
E E E E
Globalcode – Open4education
Projections
E E E E
E E E E
E E E E
E E E E
Pedido
Pedido
Produto
Cliente
Globalcode – Open4education
Projections
E E E E
E E E E
E E E E
E E E E
E E EE E E E
Pedido
Pedido
Produto
Cliente
Projection
Globalcode – Open4education
Projections - Exemplo
Globalcode – Open4education
Projections - Exemplo
NFs de Saída
S S S
S S S
S S S
Globalcode – Open4education
Projections - Exemplo
NFs de Saída
S S S
S S S
S S S
NFs de Entrada
E E E
E E E
E E E
Globalcode – Open4education
Projections - Exemplo
NFs de Saída
S S S
S S S
S S S
NFs de Entrada
E E E
E E E
E E E
Pagamentos
P P P
Globalcode – Open4education
Projections - Exemplo
PES
NFs de Saída
S S S
S S S
S S S
NFs de Entrada
E E E
E E E
E E E
Pagamentos
P P P
S S E S
Apuração
Globalcode – Open4education
Perguntas?
Globalcode – Open4education
Obrigado!
Contato:
prgoes@gmail.com

Event Sourcing - TDC 2015 - Pedro Góes