SlideShare a Scribd company logo
1 of 54
Download to read offline
CQRS w PHP?
Jak ugryźć
whoami
grzegorz.stawarczyk@grupablix.pl | stawarczyk.pl
Grzegorz Stawarczyk
Lead PHP Developer
CQS
1. Oddzielne metody zapisu i odczytu


2. Metoda zapisująca dane (Command method) nie zwraca
odpowiedzi


3. Metoda odczytująca dane (Query method) nie mody
fi
kuje ich.


Kilkukrotne wywołanie metody odczytu zwróci zawsze ten sam
rezultat.
CQS
CQRS
CQRS is simply the creation of two objects where there
was previously only one.


Greg Young
CQRS
CQRS vs CQS
1. CQS na poziomie kodu


2. CQRS na poziomie architektury
Command Query Responsibility Segregation
Command Query Separation
Dziękuję za uwagę :)
To wszystko!
CQRS
CQRS
1. Command - Do something


2. Handler


3. Bus


4. Query - Ask for something


5. Handler


6. Bus
CQRS
1. Command - Do something


2. Handler


3. Bus


4. Query - Ask for something


5. Handler?


6. Bus?
CQRS
1. Command - Do something


2. Handler


3. Bus


4. Query - Ask for something


5. Handler?


6. Bus?
CQRS
1. Command


2. Query


3. Handler


4. Command Bus


5. Event


6. Event Bus


7. Event Sourcing


8. Projection


9. Eventual Consistency


10. DDD
CQRS
1. Command


2. Query


3. Handler


4. Command Bus


5. Event


6. Event Bus


7. Event Sourcing


8. Projection


9. Eventual Consistency


10. DDD
MVC
MVC
MVC
*Deadline Driven Development
CQRS
Query Command
Command
Co ma wydarzyć
 
się w aplikacji
Co wydarzyŁO się w aplikacji
Event
Czy Handler może zwrócić dane
Nie*
Potrzebuje ID - jak żyć?
A całą encję?
Command Bus vs Event Bus
CommandBus EventBus
Ilość handlerów 1 <0, n>
Może
zwracać wartość?
Nie Nie
Może być
asynchroniczny?
Może być Może być
Po co mi Rozkazy i Zdarzenia?
1. Bardziej czytelny system - akcja -> reakcja


2. Idziemy w kierunku języka wszechobecnego


3. SRP - Single Responsibility Principle


4. OCP - Open Close Principle


5. High Cohesion (GRASP)
Asynchroniczny Handler
1. Długie operacje nie blokują odpowiedzi dla użytkownika


2. Mogą wykonywać się
 
na innej maszynie


3. Możemy użyć innej aplikacji, na przykład napisanej w innym języku


4. Async to również dodatkowe problemy :)
Jedna Baza Danych
Read Model - Query
1. Przydaje się
 
wiedza z budowania zapytań SQL


2. ORM nie zawsze jest dobrym wyjściem


3. Możemy wykorzystać widoki w SQL


"Select * From Tabela" jestem mistrzem SQL’a :)
Warstwa Cache
Middleware
Kiedy nie używać CQRS
1. Aplikacje typu CRUD


2. Prosta logika biznesowa
Kiedy używać CQRS
1. Skomplikowania logika biznesowa


2. Aplikacja sterowana zadaniami - task based UI


3. Potrzeba optymalizacji / skalowania strony zapisu lub odczytu


4. Równoległa praca w zespole - bardziej doświadczone osoby powinny
skupić
 
się
 
na stronie zapisu, a mniej doświadczone na stronie odczytu
Plusy
1. Czytelniejsza architektura aplikacji


2. Łatwiejsze wydzielenie części synchro do asynchronicznej


3. Łatwiejsze skalowanie aplikacji


4. Jeden kod niezależnie od interfejsu wejściowego (API/UI, CLI, consumer)
Minusy
1. Synchronizacja baz danych read i write - spójność
 
ostateczna


2. Dodatkowa trudność
 
dla początkujących
Jakie mamy biblioteki
1. league/tactican - nie rozwijana od 2019


2. prooph/service-bus


3. simple-bus/message-bus


4. symfony/messenger
CQRS u nas
return $this->createQueryBuilder('sli')

->select(sprintf('NEW %s(sl.id, sli.quantity, sli.price, sli.name, sli.bought, sli.properties, :lea
fl
etId, :pageNumber, :type)', PreviousShoppingListItemForLea
fl
etPageDto::class
->join('sli.lea
fl
etPageShoppingListItem', 'lpsli')

->join('sli.shoppingList', 'sl')

->join('lpsli.lea
fl
etPage', 'lp')

->where('lp.id = :lpId')

->andWhere('sli instance of :type')

->setParameter('lpId', $previousLea
fl
etPageId)

->setParameter('lea
fl
etId', $newLea
fl
etId)

->setParameter('pageNumber', $newPageNumber)

->setParameter('type', $type)

->getQuery()

->execute()

;
Co dalej?
1. Read DB


2. DDD


3. Event Sourcing
Q& A
Dziękuję
grzegorz.stawarczyk@grupablix.pl


stawarczyk.pl
Grzegorz Stawarczyk
Lead PHP Developer

More Related Content

What's hot

What's hot (20)

PostgreSQL na EXT4, XFS, BTRFS a ZFS / FOSDEM PgDay 2016
PostgreSQL na EXT4, XFS, BTRFS a ZFS / FOSDEM PgDay 2016PostgreSQL na EXT4, XFS, BTRFS a ZFS / FOSDEM PgDay 2016
PostgreSQL na EXT4, XFS, BTRFS a ZFS / FOSDEM PgDay 2016
 
The new OSGi LogService 1.4 and integrating with SLF4J
The new OSGi LogService 1.4 and integrating with SLF4JThe new OSGi LogService 1.4 and integrating with SLF4J
The new OSGi LogService 1.4 and integrating with SLF4J
 
Microservices Architecture Part 2 Event Sourcing and Saga
Microservices Architecture Part 2 Event Sourcing and SagaMicroservices Architecture Part 2 Event Sourcing and Saga
Microservices Architecture Part 2 Event Sourcing and Saga
 
Migration from AngularJS to Angular
Migration from AngularJS to AngularMigration from AngularJS to Angular
Migration from AngularJS to Angular
 
Kafka Retry and DLQ
Kafka Retry and DLQKafka Retry and DLQ
Kafka Retry and DLQ
 
From Java 17 to 21- A Showcase of JDK Security Enhancements
From Java 17 to 21- A Showcase of JDK Security EnhancementsFrom Java 17 to 21- A Showcase of JDK Security Enhancements
From Java 17 to 21- A Showcase of JDK Security Enhancements
 
MuleSoft Anypoint Platform and Three Tier Architecture
MuleSoft Anypoint  Platform and Three Tier ArchitectureMuleSoft Anypoint  Platform and Three Tier Architecture
MuleSoft Anypoint Platform and Three Tier Architecture
 
Evolution of Our Software Architecture
Evolution of Our Software ArchitectureEvolution of Our Software Architecture
Evolution of Our Software Architecture
 
Windows Azure Blob Storage
Windows Azure Blob StorageWindows Azure Blob Storage
Windows Azure Blob Storage
 
Mastering Chaos - A Netflix Guide to Microservices
Mastering Chaos - A Netflix Guide to MicroservicesMastering Chaos - A Netflix Guide to Microservices
Mastering Chaos - A Netflix Guide to Microservices
 
Oracle Apex Overview
Oracle Apex OverviewOracle Apex Overview
Oracle Apex Overview
 
Introducing Saga Pattern in Microservices with Spring Statemachine
Introducing Saga Pattern in Microservices with Spring StatemachineIntroducing Saga Pattern in Microservices with Spring Statemachine
Introducing Saga Pattern in Microservices with Spring Statemachine
 
Data Mesh @ Yelp - 2019
Data Mesh @ Yelp - 2019Data Mesh @ Yelp - 2019
Data Mesh @ Yelp - 2019
 
API Integration For Building Software Applications Powerpoint Presentation Sl...
API Integration For Building Software Applications Powerpoint Presentation Sl...API Integration For Building Software Applications Powerpoint Presentation Sl...
API Integration For Building Software Applications Powerpoint Presentation Sl...
 
Machine Learning Data Lineage with MLflow and Delta Lake
Machine Learning Data Lineage with MLflow and Delta LakeMachine Learning Data Lineage with MLflow and Delta Lake
Machine Learning Data Lineage with MLflow and Delta Lake
 
From Mainframe to Microservice: An Introduction to Distributed Systems
From Mainframe to Microservice: An Introduction to Distributed SystemsFrom Mainframe to Microservice: An Introduction to Distributed Systems
From Mainframe to Microservice: An Introduction to Distributed Systems
 
Event-Driven Architecture (EDA)
Event-Driven Architecture (EDA)Event-Driven Architecture (EDA)
Event-Driven Architecture (EDA)
 
Axon Framework, Exploring CQRS and Event Sourcing Architecture
Axon Framework, Exploring CQRS and Event Sourcing ArchitectureAxon Framework, Exploring CQRS and Event Sourcing Architecture
Axon Framework, Exploring CQRS and Event Sourcing Architecture
 
Patna MuleSoft Meetup Anypoint Cloudhub 2.0
Patna MuleSoft Meetup Anypoint Cloudhub 2.0Patna MuleSoft Meetup Anypoint Cloudhub 2.0
Patna MuleSoft Meetup Anypoint Cloudhub 2.0
 
Scalability, Availability & Stability Patterns
Scalability, Availability & Stability PatternsScalability, Availability & Stability Patterns
Scalability, Availability & Stability Patterns
 

Similar to Jak ugryźć cqrs w php?

Zwiększanie produktywności programisty php
Zwiększanie produktywności programisty phpZwiększanie produktywności programisty php
Zwiększanie produktywności programisty php
adamhmetal
 
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-PolskaModsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Leszek Mi?
 
Info meet pomiary wydajności
Info meet pomiary wydajnościInfo meet pomiary wydajności
Info meet pomiary wydajności
magda3695
 

Similar to Jak ugryźć cqrs w php? (17)

Shall we play a game? PL version
Shall we play a game? PL versionShall we play a game? PL version
Shall we play a game? PL version
 
CruiseControl.rb
CruiseControl.rbCruiseControl.rb
CruiseControl.rb
 
Pułapki programowania obiektowego
Pułapki programowania obiektowego Pułapki programowania obiektowego
Pułapki programowania obiektowego
 
Piątek z XSolve - TravisCI & Continuous Delivery
Piątek z XSolve - TravisCI & Continuous DeliveryPiątek z XSolve - TravisCI & Continuous Delivery
Piątek z XSolve - TravisCI & Continuous Delivery
 
Złam zasady i stwórz wydajny stos IP przy użyciu DPDK
Złam zasady i stwórz wydajny stos IP przy użyciu DPDKZłam zasady i stwórz wydajny stos IP przy użyciu DPDK
Złam zasady i stwórz wydajny stos IP przy użyciu DPDK
 
Php5
Php5Php5
Php5
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
 
Torquebox
TorqueboxTorquebox
Torquebox
 
Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)
 
Zwiększanie produktywności programisty php
Zwiększanie produktywności programisty phpZwiększanie produktywności programisty php
Zwiększanie produktywności programisty php
 
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-PolskaModsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
 
Praktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPlPraktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPl
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
 
Info meet pomiary wydajności
Info meet pomiary wydajnościInfo meet pomiary wydajności
Info meet pomiary wydajności
 
Technologie przetwarzania danych by ZAiIO
Technologie przetwarzania danych by ZAiIOTechnologie przetwarzania danych by ZAiIO
Technologie przetwarzania danych by ZAiIO
 
Skalowanie PostgreSQL @ DBConf.PL 2014
Skalowanie PostgreSQL @ DBConf.PL 2014Skalowanie PostgreSQL @ DBConf.PL 2014
Skalowanie PostgreSQL @ DBConf.PL 2014
 
Wprowadzenie do PHPUnit
Wprowadzenie do PHPUnitWprowadzenie do PHPUnit
Wprowadzenie do PHPUnit
 

Jak ugryźć cqrs w php?