SlideShare uma empresa Scribd logo
1 de 26
Baixar para ler offline
Event sourcing
Pare de jogar seus dados fora!
Daniel Gimenes
→ Engenheiro de software - UPX Technologies
→ 10+ anos desenvolvendo software
→ Bacharel - Sistemas de Informação
→ Evangelista - PHPSP
→ @danizord
Agenda
→ O que?
→ Por que?
→ Por que não?
→ Como?
Carrinho de compras
id name quantity
1 Produto 1 1
2 Produto 2 2
name payload
cart.created {cart_id: 1}
cart.item_added {cart_id: 1, product_id: 1}
cart.item_added {cart_id: 1, product_id: 2}
cart.item_removed {cart_id: 1, product_id: 2}
order.placed {cart_id: 1}
Projeção
function project(array $state, CarItemAddedToCart $event) : array
{
$state['items'][] = [
'id' => $event->productId(),
'name' => $event->productName(),
'quantity' => $event->quantity(),
];
return $state;
}
{
"items": [
{ "id": 1, "name": "Produto 1", "quantity": 1 },
{ "id": 2, "name": "Produto 2", "quantity": 2 }
]
}
All state is
transient and
you only store
facts.
— Greg Young
Sistemas naturalmente event sourced
→ Contabilidade
→ Financeiro
→ Legislativo
→ Médico
→ ...
Qual o valor
dos seus
dados?
Consistência
Impedance Mismatch
One might say Databases are from Mars and Objects
are from Venus. Databases do not map naturally to
object models. It’s a lot like trying to push the north
poles of two magnets together.
— Phil Haack
$data !== $behavior
→ Linguagem onipresente
→ Foco nos processos de negócio
→ Rich Domain Model
→ Projeções específicas para
cada necessidade
Arquitetura orientada a
eventos
Performance
Por que não?
→ Curva de aprendizado
→ Consistência eventual
→ Complexidade!?
"Quem nasceu pra ser
CRUD, nunca vai ser Rich
Domain Model"
— Danizord
Ingredientes
1. Domain Model
2. Event Store
3. Projections
4. Glue
Funcional
function payInvoice(InvoiceState $state, PayInvoice $command) : array
{
if ($state->isPaid()) {
throw new
!
();
}
if ($command->amount()->lowerThan($state->total())) {
throw new
!
();
}
return [InvoicePaid::occur($command->amount())];
}
function whenInvoicePaid(CartState $state, InvoicePaid $invoicePaid) : CartState
{
return $state->withStatus(InvoiceStatus::paid());
}
Projeção
function project(array $state, InvoicePaid $event) : array
{
$state[$event->timestamp()->year()] += $event->paidAmount();
return $state;
}
Orientado a objetos
class ShoppingCart
{
use EventSourcing;
private $items = [];
public function addItem(CartItem $item) : void
{
$this->recordThat(ItemAddedToCart::occur($item));
}
public function whenItemAdded(ItemAddedToCart $event) : void
{
$this->items[] = $event->item();
}
}
Prooph
→ Suporte para EventStore, PostgreSQL, MySQL,
MongoDB...
→ Event Engine para RAD
→ Documentação
!
→ Comunidade tope!
→ http://getprooph.org
Obrigado!
https://joind.in/talk/cc106

Mais conteúdo relacionado

Semelhante a Event Sourcing: pare de jogar seus dados fora!

Refactoring sem complicação!
Refactoring sem complicação!Refactoring sem complicação!
Refactoring sem complicação!Thamara Hessel
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Pablo Dall'Oglio
 
Event Sourcing - TDC 2015 - Pedro Góes
Event Sourcing - TDC 2015 - Pedro GóesEvent Sourcing - TDC 2015 - Pedro Góes
Event Sourcing - TDC 2015 - Pedro GóesPedro Góes
 
Android Wear: Expandindo as funcionalidades do seu Android
Android Wear: Expandindo as funcionalidades do seu AndroidAndroid Wear: Expandindo as funcionalidades do seu Android
Android Wear: Expandindo as funcionalidades do seu AndroidHeider Lopes
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsDiego Castro
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureVitor Ciaramella
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 

Semelhante a Event Sourcing: pare de jogar seus dados fora! (12)

Programação Web com jQuery
Programação Web com jQueryProgramação Web com jQuery
Programação Web com jQuery
 
Refactoring sem complicação!
Refactoring sem complicação!Refactoring sem complicação!
Refactoring sem complicação!
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013
 
Event Sourcing - TDC 2015 - Pedro Góes
Event Sourcing - TDC 2015 - Pedro GóesEvent Sourcing - TDC 2015 - Pedro Góes
Event Sourcing - TDC 2015 - Pedro Góes
 
Android na Prática
Android na PráticaAndroid na Prática
Android na Prática
 
Princípio DRY
Princípio DRYPrincípio DRY
Princípio DRY
 
Android Wear: Expandindo as funcionalidades do seu Android
Android Wear: Expandindo as funcionalidades do seu AndroidAndroid Wear: Expandindo as funcionalidades do seu Android
Android Wear: Expandindo as funcionalidades do seu Android
 
Clean code
Clean codeClean code
Clean code
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows Azure
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
HTML5 Hands On
HTML5 Hands OnHTML5 Hands On
HTML5 Hands On
 

Event Sourcing: pare de jogar seus dados fora!