SlideShare a Scribd company logo
1 of 23
Download to read offline
Nie wszystko co ubite,
w ziemi zostaje.
O tym jak znajomość zdarzeń pomaga w walce ze zmorami i
potworami; czyli wprowadzenie do Event Sourcing.
Daniel Stokowiec
stodan@tsh.io
Event Sourcing
Wzorzec projektowy DDD,

w którym zamiast stanu aplikacji,

przechowuje się historię zdarzeń.
id ownerId message
1 21 Starszy...
2 3 Ubijcie...
4 11 Znajdzcie...
id event message
1 ContractCreated {message: "Starszy...", ...}
2 ContractCreated {message: "Potwór...", ...}
3 ContractCreated {message: "Koza zginęła...", ...}
4 ContractRemoved { ... }
5 ContractUpdated {message: "Ubijcie...", ...}
Glosariusz
DDD

Domain Driven Design
CQRS

Command Query Responsibility Segregation
UUID

Universally unique identifier
Event Sourcing
Command Bus
Event Bus
Event Store
Read Models (Projections)
Controller
Command Bus Event Store
Event Bus
Command Handler Repository
Projector
Aggregate
Events
Events
Events
Command
Command
Event Storming
Źródło: https://twitter.com/ziobrando/status/469041430355521536
Domena aplikacji
Zlecenia
Nagrody i Transakcje
Wiedźmini i Zleceniodawcy
Miejsca
class CreateContractCommand
{
private $contractId;
private $ownerId;
private $message;
public function __construct($contractId, $ownerId, $message)
{
$this->contractId = $contractId;
$this->ownerId = $ownerId;
$this->message = $message;
}
public function getContractId() {}
public function getOwnerId() {}
public function getMessage() {}
}
use BroadwayCommandHandlingCommandHandler;
use BroadwayEventSourcingEventSourcingRepository;
class CreateContractCommandHandler extends CommandHandler
{
public function __construct(
EventSourcingRepository $repository)
{
$this->repository = $repository;
}
public function handleCreateContractCommand(
CreateContractCommand $command)
{
$contract = Contract::create(
$command->getContractId(),
$command->getOwnerId(),
$command->getMessage()
);
$this->repository->save($contract);
}
}
use BroadwayEventSourcingEventSourcedAggregateRoot;
class Contract extends EventSourcedAggregateRoot
{
private $contractId;
private $ownerId;
public function getAggregateRootId() {
return $this->contractId;
}
public static function create($invitationId, $ownerId,
$message) {
$contract = new Contract();
$contract->apply(new ContractCreatedEvent(
$contractId, $ownerId, $message));
return $contract;
}
protected function applyContractCreatedEvent(
ContractCreatedEvent $event) {
$this->contractId = $event->contractId;
$this->ownerId = $event->ownerId;
}
}
use BroadwayReadModelProjector;
use BroadwayReadModelRepositoryInterface;
class ContractProjector extends Projector
{
private $repository;
public function __construct(RepositoryInterface $repository) {
$this->repository = $repository;
}
protected function applyContractCreatedEvent(
ContractCreatedEvent $event) {
$contract = new Contract($event->getContractId());
$contract->setMessage($event->getMessage());
$this->repository->save($contract);
}
protected function applyContractMessageUpdatedEvent(
ContractMessageUpdated $event) {
$contract = $this->repository->find(
$event->getContractId());
$contract->setMessage($event->getMessage());
$this->repository->save($contract);
}
}
Pełna historia zdarzeń
Brak komplikacji w domenie*
Brak komplikacji na warstwie bazodanowej
Nie zapomniałeś o niczym, możesz spać spokojnie
Jaskier na pomoc
Historia modyfikacji zlecenia
Szczegółowy audit trail
Bezproblemowe rozgłaszanie
informacji
Północnica
Raport efektywności wiedźminów
Jak gromadzić dane?
Które dane potrzebujemy?
Co, jeżeli zmienią się
wymagania?
Co, jeżeli popełniliśmy błąd w
wyliczeniach?
Gryfa w powietrzu ślady
Gwarancja bezpieczeństwa
powiązanych danych
Zmiana informacji o ostatnim
spostrzeżeniu na ogłoszeniu
Jak dodać funkcjonalność
przedstawiania lokacji na
mapie?
Doppler niestraszny
Swoboda w doborze
odpowiednich baz danych
Dedykowane bazy na potrzeby
integracji
Możliwość eksperymentowania
Kruczki
Eventual Consistency
Komunikacja z zewnętrznymi
systemami
Inne korzyści
Service Oriented Architecture
Task oriented UI
Pomoc przy debugowaniu
Łatwiejsze testowanie
Skalowalność
Dużo odczytów, mało zapisów
Baza danych przestaje być
wąskim gardłem
Kosztowne operacje robione
asynchronicznie
Czy powinienem użyć
Event Sourcing?
Referencje
Greg Young

https://www.youtube.com/watch?v=JHGkaShoyNs
Martin Fowler

http://martinfowler.com/eaaDev/EventSourcing.html
Broadway

https://github.com/qandidate-labs/broadway
Andrzej Spakowski - "Saga o Wiedźminie"

Artworki z gry "Witcher 3"
Dziękuję
Pytania?

More Related Content

What's hot

AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawyApptension
 
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...Infoshare
 
Analizy Przestrzenne z wykorzystaniem GRASS vol.15
Analizy Przestrzenne z wykorzystaniem GRASS vol.15Analizy Przestrzenne z wykorzystaniem GRASS vol.15
Analizy Przestrzenne z wykorzystaniem GRASS vol.15WGUG
 
WordPress 4.0 - co nowego dla programistów?
WordPress 4.0 - co nowego dla programistów?WordPress 4.0 - co nowego dla programistów?
WordPress 4.0 - co nowego dla programistów?Tomasz Dziuda
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJSSages
 
Synchronizacja w PHP - Meet Magento
Synchronizacja w PHP - Meet MagentoSynchronizacja w PHP - Meet Magento
Synchronizacja w PHP - Meet Magentowjarka
 
Szymon Kulec - The only thing that matters
Szymon Kulec - The only thing that mattersSzymon Kulec - The only thing that matters
Szymon Kulec - The only thing that mattersPROIDEA
 

What's hot (9)

AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawy
 
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
 
Podstawy php
Podstawy phpPodstawy php
Podstawy php
 
Podstawy php
Podstawy phpPodstawy php
Podstawy php
 
Analizy Przestrzenne z wykorzystaniem GRASS vol.15
Analizy Przestrzenne z wykorzystaniem GRASS vol.15Analizy Przestrzenne z wykorzystaniem GRASS vol.15
Analizy Przestrzenne z wykorzystaniem GRASS vol.15
 
WordPress 4.0 - co nowego dla programistów?
WordPress 4.0 - co nowego dla programistów?WordPress 4.0 - co nowego dla programistów?
WordPress 4.0 - co nowego dla programistów?
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJS
 
Synchronizacja w PHP - Meet Magento
Synchronizacja w PHP - Meet MagentoSynchronizacja w PHP - Meet Magento
Synchronizacja w PHP - Meet Magento
 
Szymon Kulec - The only thing that matters
Szymon Kulec - The only thing that mattersSzymon Kulec - The only thing that matters
Szymon Kulec - The only thing that matters
 

More from The Software House

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...The Software House
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?The Software House
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?The Software House
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeThe Software House
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?The Software House
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSThe Software House
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptThe Software House
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptThe Software House
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLThe Software House
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychThe Software House
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciThe Software House
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case studyThe Software House
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejThe Software House
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachThe Software House
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsThe Software House
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeThe Software House
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduThe Software House
 

More from The Software House (20)

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
 
Uszanowanko Podsumowanko
Uszanowanko PodsumowankoUszanowanko Podsumowanko
Uszanowanko Podsumowanko
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon Chime
 
Migracje danych serverless
Migracje danych serverlessMigracje danych serverless
Migracje danych serverless
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScript
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScript
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danych
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case study
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny Krzemowej
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzach
 
Jak poskromić AWS?
Jak poskromić AWS?Jak poskromić AWS?
Jak poskromić AWS?
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.js
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurze
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki kodu
 

Nie wszystko, co ubite, w ziemi zostaje. Wprowadzenie do Event Sourcing