Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
EVENT SOURCING (W PHP)
PIOTR KACAŁA
EVENT SOURCING
ZBUDUJMY SOBIE KOSZYK!
POBIERANIE ZAWARTOŚCI KOSZYKA
mysql> select * from cart_products;
+---------+------------+
| cart_id | product_id |
+-----...
DODANIE PRODUKTU DO KOSZYKA
POST /CARTS/{CID}/PRODUCTS
INSERT INTO CART_PRODUCTS (…)
USUNIĘCIE PRODUKTU Z KOSZYKA
DELETE /CARTS/{CID}/PRODUCTS/{PID}
DELETE FROM CART_PRODUCTS (…)
DOBRA, MAMY KOSZYK.
PRZYPOMNIJMY
mysql> select * from cart_products;
+---------+------------+
| cart_id | product_id |
+---------+------------...
POROZMAWIAJMY O PIENIĄDZACH
A CO JEŚLI?
select * from salda_bankowe;
+---------------------+----------------+
| rachunek | ile_pieniazkow |
+---------...
PRZECIEŻ PISZE, ŻE 1000.
TRUDNO SIĘ KŁÓCIĆ
+---------------------+----------------+
| rachunek | ile_pieniazkow |
+---------------------+----------...
CZYM JEST EVENT SOURCING?
EVENT STORE
Cart #1 Was
Created
Product #B
Added 

To The Cart
Product #A
Removed 

From The Cart
Product #A
Added 

To Th...
EVENT STORE
Cart #1 Was
Created
Product #B
Added 

To The Cart
Product #A
Removed 

From The Cart
Product #A
Added 

To Th...
JAK UPRAWIAĆ EVENT SOURCING (W PHP)?
TRADYCYJNY KOSZYK
class Cart

{

private $id;

private $products = [];



public function add($productId)

{
// changing t...
KOSZYK PRODUKUJĄCY EVENTY
class Cart

{

private $id;

private $products = [];

private $raisedEvents = [];



public func...
CartRepository::add(cart)
EVENT STORE
Cart Was
Created
Product #2
Added 

To The Cart
Product #1
Added 

To The Cart
Cart Was
Checked Out
Product #1...
EVENT STORE
mysql> select * from event_store;
+----+--------------+-------------------------------------------+
| id | agg...
ODTWARZANIE AGREGATU KOSZYKA W REPOZYTORIUM
class EventSourcedCartRepository implements CartRepository

{

public function...
ENCJA
class Cart
{

// this method is called by event store to replay event on the cart
protected function applyProductAdd...
OBIE METODY
class Cart

{

public function add($productId)

{

if ($this->products > 2) {

throw new CartLimitExceeded();
...
CO Z WYDAJNOŚCIĄ?
JAK ROBIĆ ZAPYTANIA?
EVENT STORE
mysql> select * from event_store;
+----+--------------+-------------------------------------------+
| id | agg...
CQRS! READ MODEL
MAŁY RECAP
Obiekt 

domeny
Event Store
Listenery
Eventy
TRAFIAJĄ DO
ZAPISYWANE W
PRODUKUJE
PROJEKCJE
class CurrentCartProductsProjector

{

public function applyProductAddedToCart(ProductAddedToCart $event)

{

$t...
POBIERANIE ZAWARTOŚCI KOSZYKA
mysql> select * from cart_products;
+---------+------------+
| cart_id | product_id |
+-----...
CQRS W PEŁNI SWOJEJ CHWAŁY
Cart::add
Zapis w 

Event Store
Product Was
Added To Cart
Cart State
Projector
SQL
Redis
CO Z ZADANIEM OD PANI MAŁGOSI?
PODSUMOWANIE
PLUSY EVENT SOURCINGU
- HISTORYCZNY STAN APLIKACJI
- DEBUGOWANIE
- PROSTY MODEL ZAPISU
- ODPORNOŚĆ NA KREATYWNOŚĆ BIZNESU
...
MINUSY EVENT SOURCINGU
- PRÓG WEJŚCIA (ZMIANA PRZYZWYCZAJEŃ)
- KONIECZNOŚĆ SHARDOWANIA EVENT STORE’U*
- DŁUŻSZY ŁADOWANIE ...
/QANDIDATE-LABS/BROADWAY
CIEKAWOSTKA
PYTANIA?
DZIĘKI! d:-)
/WORK
Upcoming SlideShare
Loading in …5
×

Event sourcing w PHP (by Piotr Kacała)

2,202 views

Published on

Event sourcing w pigułce czyli podróże w czasie i odporność na coraz to bardziej kreatywne wymagania biznesowe. Kiedy, jak i po co tworzyć naturalny log wydarzeń Twojej aplikacji - plusy i minusy wzorca, przykłady implementacji, event sourcing a CQRS.

Published in: Software
  • Be the first to comment

Event sourcing w PHP (by Piotr Kacała)

  1. 1. EVENT SOURCING (W PHP) PIOTR KACAŁA
  2. 2. EVENT SOURCING
  3. 3. ZBUDUJMY SOBIE KOSZYK!
  4. 4. POBIERANIE ZAWARTOŚCI KOSZYKA mysql> select * from cart_products; +---------+------------+ | cart_id | product_id | +---------+------------+ | 1 | 124 | | 1 | 89 | +---------+------------+
  5. 5. DODANIE PRODUKTU DO KOSZYKA POST /CARTS/{CID}/PRODUCTS INSERT INTO CART_PRODUCTS (…)
  6. 6. USUNIĘCIE PRODUKTU Z KOSZYKA DELETE /CARTS/{CID}/PRODUCTS/{PID} DELETE FROM CART_PRODUCTS (…)
  7. 7. DOBRA, MAMY KOSZYK.
  8. 8. PRZYPOMNIJMY mysql> select * from cart_products; +---------+------------+ | cart_id | product_id | +---------+------------+ | 1 | 124 | | 1 | 89 | +---------+------------+
  9. 9. POROZMAWIAJMY O PIENIĄDZACH
  10. 10. A CO JEŚLI? select * from salda_bankowe; +---------------------+----------------+ | rachunek | ile_pieniazkow | +---------------------+----------------+ | 4444 3333 2222 1111 | 1000 | +---------------------+----------------+
  11. 11. PRZECIEŻ PISZE, ŻE 1000.
  12. 12. TRUDNO SIĘ KŁÓCIĆ +---------------------+----------------+ | rachunek | ile_pieniazkow | +---------------------+----------------+ | 4444 3333 2222 1111 | 1000 | +---------------------+----------------+
  13. 13. CZYM JEST EVENT SOURCING?
  14. 14. EVENT STORE Cart #1 Was Created Product #B Added 
 To The Cart Product #A Removed 
 From The Cart Product #A Added 
 To The Cart Cart #1 Was Checked Out
  15. 15. EVENT STORE Cart #1 Was Created Product #B Added 
 To The Cart Product #A Removed 
 From The Cart Product #A Added 
 To The Cart Cart #1 Was Checked Out
  16. 16. JAK UPRAWIAĆ EVENT SOURCING (W PHP)?
  17. 17. TRADYCYJNY KOSZYK class Cart
 {
 private $id;
 private $products = [];
 
 public function add($productId)
 { // changing the state of the cart $this->products[] = $productId;
 }
 }
  18. 18. KOSZYK PRODUKUJĄCY EVENTY class Cart
 {
 private $id;
 private $products = [];
 private $raisedEvents = [];
 
 public function add($productId)
 { // changing the state of the cart
 $this->products[] = $productId;
 
 // let's raise an event
 $this->raisedEvents[] = new ProductAddedToCart($this->id, $productId);
 }
 }
  19. 19. CartRepository::add(cart)
  20. 20. EVENT STORE Cart Was Created Product #2 Added 
 To The Cart Product #1 Added 
 To The Cart Cart Was Checked Out Product #1 Removed 
 From The Cart
  21. 21. EVENT STORE mysql> select * from event_store; +----+--------------+-------------------------------------------+ | id | aggregate_id | event | +----+--------------+-------------------------------------------+ | 1 | 1 | CartWasCreated({"cartId":"1"}) | | 2 | 1 | ProductAddedToCart({"productId":"A"}) | | 3 | 1 | ProductRemovedFromCart({"productId":"A"}) | | 4 | 1 | ProductAddedToCart({"productId":"B"}) | +----+--------------+-------------------------------------------+
  22. 22. ODTWARZANIE AGREGATU KOSZYKA W REPOZYTORIUM class EventSourcedCartRepository implements CartRepository
 {
 public function find($aggregateId)
 {
 $events = $this->eventStore->findEvents($aggregateId);
 $cart = new Cart(); // inicjalizacja pustego agregatu
 
 // "nagrywanie" eventów na agregacie cartu
 foreach($events as $event) { 
 // metoda apply() woła odpowiednie metody prywatne
 // na podstawie nazwy przekazywanego eventu, np.
 // ProductWasAddedToCart => applyProductWasAddedToCart
 $cart->apply($event); 
 }
 }
 }
  23. 23. ENCJA class Cart {
 // this method is called by event store to replay event on the cart protected function applyProductAddedToCart(ProductAddedToCart $event)
 {
 $this->products[] = $event->getProductId();
 }
 }
  24. 24. OBIE METODY class Cart
 {
 public function add($productId)
 {
 if ($this->products > 2) {
 throw new CartLimitExceeded();
 }
 
 // raise the event
 $event = new ProductAddedToCart($this->id, $productId);
 $this->raisedEvents[] = $event;
 
 // change the state
 $this->applyProductAddedToCart($event);
 }
 
 // change the state, this is called by Event Store
 public function applyProductAddedToCart(ProductAddedToCart $event)
 {
 $this->products[] = $event->getProductId();
 }
 }
  25. 25. CO Z WYDAJNOŚCIĄ?
  26. 26. JAK ROBIĆ ZAPYTANIA?
  27. 27. EVENT STORE mysql> select * from event_store; +----+--------------+-------------------------------------------+ | id | aggregate_id | event | +----+--------------+-------------------------------------------+ | 1 | 1 | CartWasCreated({"cartId":"1"}) | | 2 | 1 | ProductAddedToCart({"productId":"A"}) | | 3 | 1 | ProductRemovedFromCart({"productId":"A"}) | | 4 | 1 | ProductAddedToCart({"productId":"B"}) | +----+--------------+-------------------------------------------+
  28. 28. CQRS! READ MODEL
  29. 29. MAŁY RECAP Obiekt 
 domeny Event Store Listenery Eventy TRAFIAJĄ DO ZAPISYWANE W PRODUKUJE
  30. 30. PROJEKCJE class CurrentCartProductsProjector
 {
 public function applyProductAddedToCart(ProductAddedToCart $event)
 {
 $this->connection->query('insert into cart_products ...');
 }
 
 public function applyProductRemovedFromCart(ProductRemovedFromCart $event)
 {
 $this->connection->query('delete from cart_products ...');
 }
 }
  31. 31. POBIERANIE ZAWARTOŚCI KOSZYKA mysql> select * from cart_products; +---------+------------+ | cart_id | product_id | +---------+------------+ | 1 | 124 | | 1 | 89 | +---------+------------+
  32. 32. CQRS W PEŁNI SWOJEJ CHWAŁY Cart::add Zapis w 
 Event Store Product Was Added To Cart Cart State Projector SQL Redis
  33. 33. CO Z ZADANIEM OD PANI MAŁGOSI?
  34. 34. PODSUMOWANIE
  35. 35. PLUSY EVENT SOURCINGU - HISTORYCZNY STAN APLIKACJI - DEBUGOWANIE - PROSTY MODEL ZAPISU - ODPORNOŚĆ NA KREATYWNOŚĆ BIZNESU - ŁATWA SKALOWALNOŚĆ - WSPÓŁGRA Z MIKROSERWISAMI
  36. 36. MINUSY EVENT SOURCINGU - PRÓG WEJŚCIA (ZMIANA PRZYZWYCZAJEŃ) - KONIECZNOŚĆ SHARDOWANIA EVENT STORE’U* - DŁUŻSZY ŁADOWANIE OBIEKTÓW DOMENOWYCH** - ZWIĘKSZA ZŁOŻONOŚĆ APLIKACJI (VS CRUD) * NIE DOTYCZY WSZYSTKICH APLIKACJI ** ROZWIĄZANY PRZEZ SNAPSHOTY
  37. 37. /QANDIDATE-LABS/BROADWAY
  38. 38. CIEKAWOSTKA
  39. 39. PYTANIA?
  40. 40. DZIĘKI! d:-)
  41. 41. /WORK

×