Successfully reported this slideshow.
Your SlideShare is downloading. ×

Event sourcing w PHP (by Piotr Kacała)

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 41 Ad

Event sourcing w PHP (by Piotr Kacała)

Download to read offline

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.

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.

Advertisement
Advertisement

More Related Content

Slideshows for you (20)

Similar to Event sourcing w PHP (by Piotr Kacała) (20)

Advertisement

More from GOG.com dev team (16)

Recently uploaded (20)

Advertisement

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

×