SlideShare a Scribd company logo
1 of 33
Michał Brzuchalski @brzuchal
Technical Lead w EASI’R
Procesy długożyjące
Wzorzec Saga
Monolit
UI Data Access Layer Storage
Monolit
UI Data Access Layer Storage
Queue
Monolit
Problemy
• Zarządzanie zmianą
• Jednolity stack technologiczny
• Skalowalność
Mikroserwisy
UI Microservice Storage
Mikroserwisy
API Microservice Storage
UI
Mikroserwisy
API Microservice Storage
Microservice Storage
UI
Storage
Storage
Storage
Queue
Queue
Queue
Mikroserwisy
API Microservice
Microservice
Microservice
Microservice
UI
Mikroserwisy
Problemy
• Obsługa zdarzeń tylko raz
• Ostateczna spójność
• Dostępność/Wydajność
Spójność
Monolit - ACID Transaction
Mikroserwis - Distributed Transaction
Storage
Storage
Storage
Queue
Queue
Queue
Mikroserwisy 2PC
API HotelService
FlightService
CarService
UI
Distributed Transaction
Saga
Long Lived Transactions (LLTs)
— Hector Garcia-Molina, Kenneth Salem 1987
Saga
Persystentny Multi-listener
— Sławek Sobótka
Saga
Seria transakcji
T1, T1, T3, …, Tn
Seria transakcji z kompensacją
T1, T1, T3, …, Tj, Cj, …, C3, C2, C1
Storage
Storage
Storage
Queue
Queue
Queue
Mikroserwisy Saga
API HotelService
FlightService
CarService
UI
Local
Transaction
Local
Transaction
Local
Transaction
Choreografia
Storage
Storage
Storage
Queue
Queue
Queue
Mikroserwisy Saga
API PaymentService
ShipmentService
OrderService
UI
Local
Transaction
Local
Transaction
Local
Transaction
Choreografia
Orkiestracja
Storage
Storage
Storage
Queue
Queue
Queue
Mikroserwisy Saga
API PaymentService
ShipmentService
OrderService
UI
Local
Transaction
Local
Transaction
Local
Transaction
Orkiestracja
OrderProcess
Storage
Storage
Storage
Queue
Queue
Queue
Mikroserwisy Saga
API PaymentService
ShipmentService
OrderService
UI
Local
Transaction
Local
Transaction
Local
Transaction
Orkiestracja
OrderProcess
API
Saga a Agregat
Początek Sagi
Deadline
Kompensacja Sagi
Koniec życia Sagi
EventListenery?!
Rozsiana logika?!
PHPers Summit 25.06.2022
Dzięki
@mbrzuchalski
michal.brzuchalski@gmail.com

More Related Content

What's hot

MySQL Database Architectures - 2020-10
MySQL Database Architectures -  2020-10MySQL Database Architectures -  2020-10
MySQL Database Architectures - 2020-10Kenny Gryp
 
Managing multiple event types in a single topic with Schema Registry | Bill B...
Managing multiple event types in a single topic with Schema Registry | Bill B...Managing multiple event types in a single topic with Schema Registry | Bill B...
Managing multiple event types in a single topic with Schema Registry | Bill B...HostedbyConfluent
 
Materialize: a platform for changing data
Materialize: a platform for changing dataMaterialize: a platform for changing data
Materialize: a platform for changing dataAltinity Ltd
 
Introduction to Kafka Streams
Introduction to Kafka StreamsIntroduction to Kafka Streams
Introduction to Kafka StreamsGuozhang Wang
 
Integration Patterns for Microservices Architectures
Integration Patterns for Microservices ArchitecturesIntegration Patterns for Microservices Architectures
Integration Patterns for Microservices ArchitecturesNATS
 
Infrastructure at Scale: Apache Kafka, Twitter Storm & Elastic Search (ARC303...
Infrastructure at Scale: Apache Kafka, Twitter Storm & Elastic Search (ARC303...Infrastructure at Scale: Apache Kafka, Twitter Storm & Elastic Search (ARC303...
Infrastructure at Scale: Apache Kafka, Twitter Storm & Elastic Search (ARC303...Amazon Web Services
 
How to size up an Apache Cassandra cluster (Training)
How to size up an Apache Cassandra cluster (Training)How to size up an Apache Cassandra cluster (Training)
How to size up an Apache Cassandra cluster (Training)DataStax Academy
 
Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기NeoClova
 
Kata: Hexagonal Architecture / Ports and Adapters
Kata: Hexagonal Architecture / Ports and AdaptersKata: Hexagonal Architecture / Ports and Adapters
Kata: Hexagonal Architecture / Ports and Adaptersholsky
 
Database Performance Tuning
Database Performance Tuning Database Performance Tuning
Database Performance Tuning Arno Huetter
 
Exadata SMART Monitoring - OEM 13c
Exadata SMART Monitoring - OEM 13cExadata SMART Monitoring - OEM 13c
Exadata SMART Monitoring - OEM 13cAlfredo Krieg
 
Securing Kafka
Securing Kafka Securing Kafka
Securing Kafka confluent
 
Kafka Security 101 and Real-World Tips
Kafka Security 101 and Real-World Tips Kafka Security 101 and Real-World Tips
Kafka Security 101 and Real-World Tips confluent
 
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricksQuery Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricksJaime Crespo
 
Designing Structured Streaming Pipelines—How to Architect Things Right
Designing Structured Streaming Pipelines—How to Architect Things RightDesigning Structured Streaming Pipelines—How to Architect Things Right
Designing Structured Streaming Pipelines—How to Architect Things RightDatabricks
 
Best Practices for the Most Impactful Oracle Database 18c and 19c Features
Best Practices for the Most Impactful Oracle Database 18c and 19c FeaturesBest Practices for the Most Impactful Oracle Database 18c and 19c Features
Best Practices for the Most Impactful Oracle Database 18c and 19c FeaturesMarkus Michalewicz
 
MariaDB MaxScale
MariaDB MaxScaleMariaDB MaxScale
MariaDB MaxScaleMariaDB plc
 

What's hot (20)

MySQL Database Architectures - 2020-10
MySQL Database Architectures -  2020-10MySQL Database Architectures -  2020-10
MySQL Database Architectures - 2020-10
 
Managing multiple event types in a single topic with Schema Registry | Bill B...
Managing multiple event types in a single topic with Schema Registry | Bill B...Managing multiple event types in a single topic with Schema Registry | Bill B...
Managing multiple event types in a single topic with Schema Registry | Bill B...
 
Materialize: a platform for changing data
Materialize: a platform for changing dataMaterialize: a platform for changing data
Materialize: a platform for changing data
 
Introduction to Kafka Streams
Introduction to Kafka StreamsIntroduction to Kafka Streams
Introduction to Kafka Streams
 
Integration Patterns for Microservices Architectures
Integration Patterns for Microservices ArchitecturesIntegration Patterns for Microservices Architectures
Integration Patterns for Microservices Architectures
 
Infrastructure at Scale: Apache Kafka, Twitter Storm & Elastic Search (ARC303...
Infrastructure at Scale: Apache Kafka, Twitter Storm & Elastic Search (ARC303...Infrastructure at Scale: Apache Kafka, Twitter Storm & Elastic Search (ARC303...
Infrastructure at Scale: Apache Kafka, Twitter Storm & Elastic Search (ARC303...
 
ACID - Transakcje
ACID - TransakcjeACID - Transakcje
ACID - Transakcje
 
How to size up an Apache Cassandra cluster (Training)
How to size up an Apache Cassandra cluster (Training)How to size up an Apache Cassandra cluster (Training)
How to size up an Apache Cassandra cluster (Training)
 
Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기
 
Kata: Hexagonal Architecture / Ports and Adapters
Kata: Hexagonal Architecture / Ports and AdaptersKata: Hexagonal Architecture / Ports and Adapters
Kata: Hexagonal Architecture / Ports and Adapters
 
Database Performance Tuning
Database Performance Tuning Database Performance Tuning
Database Performance Tuning
 
Exadata SMART Monitoring - OEM 13c
Exadata SMART Monitoring - OEM 13cExadata SMART Monitoring - OEM 13c
Exadata SMART Monitoring - OEM 13c
 
Securing Kafka
Securing Kafka Securing Kafka
Securing Kafka
 
Kafka Security 101 and Real-World Tips
Kafka Security 101 and Real-World Tips Kafka Security 101 and Real-World Tips
Kafka Security 101 and Real-World Tips
 
Kubernetes Basics
Kubernetes BasicsKubernetes Basics
Kubernetes Basics
 
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricksQuery Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
 
Designing Structured Streaming Pipelines—How to Architect Things Right
Designing Structured Streaming Pipelines—How to Architect Things RightDesigning Structured Streaming Pipelines—How to Architect Things Right
Designing Structured Streaming Pipelines—How to Architect Things Right
 
Planning for Disaster Recovery (DR) with Galera Cluster
Planning for Disaster Recovery (DR) with Galera ClusterPlanning for Disaster Recovery (DR) with Galera Cluster
Planning for Disaster Recovery (DR) with Galera Cluster
 
Best Practices for the Most Impactful Oracle Database 18c and 19c Features
Best Practices for the Most Impactful Oracle Database 18c and 19c FeaturesBest Practices for the Most Impactful Oracle Database 18c and 19c Features
Best Practices for the Most Impactful Oracle Database 18c and 19c Features
 
MariaDB MaxScale
MariaDB MaxScaleMariaDB MaxScale
MariaDB MaxScale
 

Similar to Procesy długożyjące - Wzorzec Sagi

Tech cafe Microservices
Tech cafe MicroservicesTech cafe Microservices
Tech cafe MicroservicesKonrad Król
 
PLNOG 8: Tomaz Kozar - UCaaS jako usługa z chmury
PLNOG 8: Tomaz Kozar - UCaaS jako usługa z chmury PLNOG 8: Tomaz Kozar - UCaaS jako usługa z chmury
PLNOG 8: Tomaz Kozar - UCaaS jako usługa z chmury PROIDEA
 
Rozproszona i asynchroniczna architektura - case study - Spread it
Rozproszona i asynchroniczna architektura - case study - Spread itRozproszona i asynchroniczna architektura - case study - Spread it
Rozproszona i asynchroniczna architektura - case study - Spread itKrzysztof Szabelski
 
Azure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieAzure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieVimanet
 
Azure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieAzure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieŁukasz Bargieł
 
Bartlomiej Anszperger - Od sieci Metro do sieci Carrier Ethernet
Bartlomiej Anszperger - Od sieci Metro do sieci Carrier EthernetBartlomiej Anszperger - Od sieci Metro do sieci Carrier Ethernet
Bartlomiej Anszperger - Od sieci Metro do sieci Carrier EthernetPROIDEA
 

Similar to Procesy długożyjące - Wzorzec Sagi (7)

Mikrousługi w allegro
Mikrousługi w allegroMikrousługi w allegro
Mikrousługi w allegro
 
Tech cafe Microservices
Tech cafe MicroservicesTech cafe Microservices
Tech cafe Microservices
 
PLNOG 8: Tomaz Kozar - UCaaS jako usługa z chmury
PLNOG 8: Tomaz Kozar - UCaaS jako usługa z chmury PLNOG 8: Tomaz Kozar - UCaaS jako usługa z chmury
PLNOG 8: Tomaz Kozar - UCaaS jako usługa z chmury
 
Rozproszona i asynchroniczna architektura - case study - Spread it
Rozproszona i asynchroniczna architektura - case study - Spread itRozproszona i asynchroniczna architektura - case study - Spread it
Rozproszona i asynchroniczna architektura - case study - Spread it
 
Azure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieAzure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenie
 
Azure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenieAzure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenie
 
Bartlomiej Anszperger - Od sieci Metro do sieci Carrier Ethernet
Bartlomiej Anszperger - Od sieci Metro do sieci Carrier EthernetBartlomiej Anszperger - Od sieci Metro do sieci Carrier Ethernet
Bartlomiej Anszperger - Od sieci Metro do sieci Carrier Ethernet
 

Procesy długożyjące - Wzorzec Sagi

Editor's Notes

  1. W systemach monolitycznych mamy: zcentralizowany punkt przechowywania danych Transakcje ACID (atomicity, consistency, isolation, durability) niepodzielność - w całości, albo w ogóle - przykład transfer pieniędzy spójność - nie zostaną naruszone zasady integralności izolacja - dwie transakcje wykonują się współbieżnie (w zależności od poziomu izolacji) nie widzą wprowadzanych przez siebie zmian trwałość - potrafi uruchomić się i udostępnić spójne, nienaruszone i aktualne dane zapisane w ramach zatwierdzonych transakcji, na przykład po nagłej awarii zasilania
  2. Pojawiają się pierwsze problemy ze skalowalnością Wprowadzamy kolejki Ale nadal pracujemy w jednym projekcie, gdzie wprowadzanie zmian jest mozolne, musi być dobrze skoordynowane
  3. W systemach monolitycznych problemem jest: Większe zmiany muszą często być skorelowane we wszystkich modułach Upgrade frameworku lub vendora może przynieść sporo wyzwań w trakcie developmentu i na CR Easi’r 326 endpointów publicznych 42 agregaty
  4. Zmieniamy podejście idziemy w stronę mikroserwisów Najpierw pojawia się jeden Uber mikroservice - taki mdakroserwice w zasadzie
  5. Każdy mikroserwis musi mieć swoje API wiadomo, odseparowujemy UI poprzez API Gateway Pojawiają się urządzenia mobilne Pojawiają się nowi klienci korzystający z klientów API
  6. Pojawiają się kolejne mikroserwisy, nowe lub wydzierane z Uber mikroserwisu Nowe mikroserwisy mają oddzielne bazy danych (SQL / NoSQL nie ma znaczenia) API Gateway ma więcej roboty możemy zacząć skalować kendpointy Łatwiej zarządzać zmianą w każdym z osobna
  7. Pojawiają się kolejne mikroserwisy, z odrębnymi bazami danych Na tym poziomie już widać że problemy ze spójnością danych mogą się pojawić Tradycyjne transakcje bazodanowe nie realne do osiągnięcia Mamy problemy z wydajnością, zwykłe skalowanie nie wystarcza Mamy piki ruchu i potrzebujemy rozładować co się da na kolejkach
  8. Zarządzanie zmianą końcu nie jest problemem (może nie do końca ale przynajmniej większość zmian w dziedzinie mikroserwisu wdrażamy mniejszym impaktem na pozostałe) Ostateczna spójność (Eventual Consistency) fajnie to opisał Radek Maziarka Dlaczego Bounded Contexty są ważne - ostateczna spójność gdy system działał jako monolit - OK połączenia do tej samej bazy danych, jeden proces, łatwo było rollbackować transakcje.
  9. Jak zapewnić spójność danych w systemie rozproszonym? W systemach rozproszonych podzielonych na mikrosierwisy każdy z mikroserwisów będzie korzystał z własnej bazy danych (relacyjnej bądź nie) stąd brak możliwości rozpostarcia transakcji bazodanowej (systemy mogą fizycznie być w różnych centrach danych).
  10. Przy 2PC rozciągamy transakcję na wszystkie mikroserwisy 2PC - Two Phase Commit - Prepare a potem Commit - w PHP?! Rzeźba do tego Single Point of failure (jedno miejsce zarządza transakcją)
  11. SAGA Pattern jest szeroko stosowany od ponad 20 lat. Często Process Manager jest rozumiany tożsamo ze wzorcem Sagi.
  12. whose execution, even without interference from other transactions, takes substantial amount of time, possibly on the order of hours or day
  13. Saga to coś co może rozciągać się w czasie niczym telenowela. Saga jest patternem służącym do orkiestracji wielu zdarzeń, które mogą zajść w rozproszonym systemie w nieokreślonej kolejności. Czas pomiędzy zajściem zdarzeń może być relatywnie długi, dlatego należy persystować jej stan w czasie oczekiwania na kolejne zdarzenie.
  14. Saga to coś co może rozciągać się w czasie niczym telenowela. Saga jest wzorcem służącym do orkiestracji wielu zdarzeń, które mogą zajść w rozproszonym systemie w nieokreślonej kolejności. Czas pomiędzy zajściem zdarzeń może być relatywnie długi, dlatego należy persystować jej stan w czasie oczekiwania na kolejne zdarzenie.
  15. Zamiast tego przy pomocy Sagi sprowadzamy to do SERII lokalnych transakcji które implementują ACID Lecz cała seria transakcji razem implementuje ACD nie ma izolacji Co to była izolacja, przypomnienie: izolacja - dwie transakcje wykonują się współbieżnie (w zależności od poziomu izolacji) nie widzą wprowadzanych przez siebie zmian BookCar i BookHotel będą widoczne dla innych przed zakończeniem cyklu życia Sagi W trakcie wykonywania procesu Sagi w ujęciu transakcyjnym zmiany dokonane przez jeden proces będą widoczne przez wszystkich w trakcie trwania procesu
  16. Istnieje kilka sposobów implementacji wzorca SAGA, Główne to Choreografia i Orchestrator.
  17. Istnieje kilka sposobów implementacji wzorca SAGA, Główne to Choreografia i Orchestrator.
  18. 1. OrderCreated zdarzenie Agregatu Order w OrderService 2. PaymentService(OrderCreated) listener dispatchuje CreatePayment które się procesuje i albo jest Completed / Failed 3. PaymentCompleted obsługiwane przez ShipmentService itd.
  19. Istnieje kilka sposobów implementacji wzorca SAGA, Główne to Choreografia i Orchestrator.
  20. 1. OrderCreated zdarzenie Agregatu Order w OrderService 2. OrderProcess(OrderCreated) dispatchuje CreatePayment które się procesuje i albo jest Completed / Failed 3. PaymentCompleted obsługiwane przez OrderProcess itd. Przewaga Logika w jednym miejscu Stan procesu / transakcji w jednym miejscu Łatwiejsze zarządzanie zmianą (decoupling kolejki)
  21. Orkiestracja pozwala zarządzać procesem z boku co pozwala na integrowanie mikroserwisów i całych usług różnych dostawców 3rd parties Nic nas nie ogranicza, nie ma “DistributedTransaction” jak w 2PC Przewaga nadal taka sama Logika w jednym miejscu Stan procesu / transakcji w jednym miejscu Łatwiejsze zarządzanie zmianą (decoupling kolejki) Łatwość wymiany całej usługi Seria transakcji z kompensacją ma zapobiec niespójnościom. Nie zrealizowany payment - zamówienie anulowane Nie dostarczony towar - zwrot środków, zamówienie anulowane
  22. Analogia do Agregatów Agregaty(Commandy) -> Eventy Saga(Eventy) -> Commandy
  23. StartSagi determinuje zdarzenie i wybrana polityka IfNoneExist Always Never SagaMessageHandler adnotacja determinuje key po którym znajdujemy konkretną instancję Metody Sagi powinny być idempotentne
  24. Każda metoda sagi powinna mieć kopensację jeśli jest cień szansy na Exception Metody kompensujące powinny być idempotentne tak samo jak metody Sagi
  25. Nie ma event listenerów! Saga jest tym persystentnym multi event listeners Który jedyne co robi to nadzoruje proces i wydaje komendy Ewentualnie nakłada deadline’y lub kompensuje niepowodzenia
  26. Logika jest w jednym miejscu, w implementacji Sagi Nie potrzebujemy dodatkowych agregatów np. OrderProcess ani specjalnego repozytorium Spora część kodu zastąpiona przez zautomatyzowany mechanizm persystencji każdej instancji Sagi Serializujemy instancje Sagi, do JSON lub PHP nie ma znaczenia (JSON lepiej widać w bazie) Przy kolejnym zdarzeniu szukamy instancji Sagi po kluczu i odserializowujemy Wywołujemy metodę handlera Obsługujemy wyjątki Zapisujemy nowe powiązania Kończymy cykl życia instancji Planujemy nowe deadline’y Anulujemy deadline’y Przykłąd OrderProcessing ma ok 120 lini kodu! Tylko