CQRS – Command-Query Responsibility  Segregation

Command Query Responsibility Segregation (CQRS) to wzorzec projektowy, który rozdziela operacje zmieniające stan aplikacji od tych, które jedynie odczytują dane, czyli komendy i zapytania. Nazwa tego wzorca wywodzi się od koncepcji Command-Query Separation (CQS) autorstwa Bertranda Meyera, zgodnie z którą każda metoda powinna być albo komendą, która zmienia stan aplikacji, albo zapytaniem, które odczytuje stan, ale nigdy obu naraz. CQRS rozszerza tę zasadę na poziomie architektury aplikacji, co umożliwia oddzielenie logiki biznesowej odpowiedzialnej za zapisy od tej odpowiedzialnej za odczyty.

CQRS – Co to?

CQRS to wzorzec szczególnie przydatny w systemach o dużej złożoności, które wymagają zarówno skalowalności, jak i wysokiej wydajności w przetwarzaniu danych.
W architekturze CQRS operacje zapisu i odczytu danych są obsługiwane przez różne komponenty aplikacji, co przynosi szereg korzyści:

  1. Rozdział odpowiedzialności – Dzięki separacji logiki komend i zapytań możemy niezależnie rozwijać i optymalizować te dwa aspekty systemu. Ułatwia to wprowadzanie zmian w logice zapisu lub odczytu bez wpływu na drugi komponent.
  2. Skalowalność – W systemach, które wymagają dużych mocy obliczeniowych, CQRS umożliwia skalowanie osobno warstwy zapisu i warstwy odczytu. Można dostosować zasoby, które będą działały efektywniej dla różnych typów operacji.
  3. Lepsza obsługa złożonych operacji – CQRS pozwala na stosowanie różnych modeli danych dla operacji zapisu i odczytu. Dzięki temu aplikacja może korzystać z bardziej zoptymalizowanych struktur danych podczas odczytów, co przekłada się na poprawę wydajności.
  4. Event Sourcing – CQRS dobrze integruje się z event sourcingiem, gdzie zmiany stanu są przechowywane jako seria zdarzeń (events). Dzięki temu można odtworzyć pełną historię stanu aplikacji.

Architektura CQRS składa się z dwóch głównych komponentów: warstwy komend (command side) i warstwy zapytań (query side). Strona komend odpowiada za przetwarzanie żądań zmiany stanu, podczas gdy strona zapytań obsługuje żądania odczytu danych. Komendy to operacje, które modyfikują stan, natomiast zapytania służą do uzyskiwania danych bez ich modyfikacji.

 

CQRS – PHP

W PHP możemy wdrożyć CQRS, korzystając z kilku technik i narzędzi. Przykładowa implementacja może zawierać warstwy: Command Handlers (obsługujące zmiany stanu)
oraz Query Handlers (obsługujące odczyty danych). Istnieje kilka frameworków i bibliotek, które mogą wspomóc implementację CQRS w PHP, m.in.:

  • Broadway – narzędzie stworzone specjalnie do wspierania CQRS i event sourcingu w aplikacjach PHP. Ułatwia pracę z komendami, zapytaniami, a także event sourcingiem
    i agregatami.
  • Laravel CQRS – pakiet i rozwiązania CQRS, które mogą być stosowane w ramach frameworka Laravel, co jest szczególnie przydatne w dużych aplikacjach webowych.
  • SimpleBus – proste narzędzie dla PHP, które implementuje wzorzec CQRS oraz umożliwia pracę z eventami.

Przykład implementacji CQRS w PHP:

  1. Komendy i Query Handlers – Każda komenda jest przetwarzana przez dedykowany handler (Command Handler), który wykonuje operację zmieniającą stan aplikacji.
    Zapytania są obsługiwane przez Query Handlers, które mogą być zoptymalizowane dla wydajności odczytu.
  2. Rozdzielone modele danych – CQRS umożliwia stworzenie dwóch różnych modeli danych: jeden dla zapisu (np. w bazie relacyjnej), drugi zoptymalizowany pod odczyt
    (np. w bazie dokumentowej).

Dzięki temu aplikacja może osiągać lepszą wydajność, co jest istotne w dużych systemach, które muszą szybko przetwarzać duże ilości danych.

 

CQRS – JAVA

Java jest jednym z języków, które dobrze nadają się do implementacji CQRS, szczególnie w połączeniu z frameworkiem Spring. W Javie można stosować różne narzędzia i wzorce, takie jak Spring Boot, które ułatwiają zarządzanie aplikacjami i pozwalają na prostą integrację z CQRS. Zaletą Javy jest jej rozbudowany ekosystem narzędzi wspierających mikroserwisy i duże systemy oparte na event sourcingu.

Przykłady implementacji CQRS w Javie:

  1. Spring Framework – Spring oferuje różne moduły wspierające tworzenie aplikacji opartych na CQRS, w tym Spring Data dla operacji na bazach danych i Spring Boot,
    który umożliwia łatwe tworzenie aplikacji opartych na mikroserwisach.
  2. Axon Framework – Axon to dedykowane narzędzie dla Javy wspierające CQRS i event sourcing. Oferuje gotowe rozwiązania dla zarządzania komendami
    i zapytaniami oraz ułatwia implementację event sourcingu.

W Javie CQRS pozwala na skalowanie aplikacji w systemach o dużym obciążeniu, a także zapewnia lepszą organizację kodu, co ułatwia utrzymanie i rozwój aplikacji.
Dzięki rozdzieleniu logiki odczytu i zapisu można efektywnie zarządzać zasobami i lepiej reagować na wymagania biznesowe.

 

CQS vs CQRS

Command-Query Separation (CQS) to zasada wprowadzona przez Bertranda Meyera, która mówi, że metoda powinna pełnić jedną z dwóch funkcji – powinna być albo komendą (czyli zmieniać stan aplikacji), albo zapytaniem (czyli zwracać dane bez modyfikowania stanu). CQS jest zasadą bardziej ogólną i stosowaną głównie na poziomie metod
w programowaniu obiektowym.

CQRS, czyli Command-Query Responsibility Segregation, rozszerza tę koncepcję na poziom całej aplikacji, co oznacza oddzielenie warstwy zapisu od warstwy odczytu.
W przeciwieństwie do CQS, które dotyczy pojedynczych metod, CQRS jest wzorcem architektonicznym, który sprawdza się w bardziej złożonych systemach.

Różnice między CQS a CQRS

CQS CQRS
Dotyczy pojedynczych metod w kodzie. Dotyczy całej architektury aplikacji.
Ma na celu rozdzielenie logiki w obrębie jednej klasy lub metody. Pozwala na tworzenie oddzielnych warstw dla odczytu i zapisu.
Prostota, niższy poziom złożoności. Wyższy poziom złożoności, bardziej rozbudowana architektura.
Stosowany w programowaniu obiektowym. Stosowany głównie w systemach rozproszonych.

Stosowanie wzorca CQRS jest bardziej zaawansowane i często zarezerwowane dla aplikacji o większej skali, które wymagają wysokiej wydajności i są odpowiednie do skalowania
w rozproszonych środowiskach.

  • Szukasz dodatkowych informacji?

    Zapraszamy do konatktu telefonicznego lub za pomocą formularza kontaktowego.

Copyright © 2025 Geotechnology IT Group Sp. z o.o. - Wszelkie prawa zastrzeżone

realizacja: estinet.pl
Menu

Geotechnology IT Group Sp. z o.o.

ul. Przyokopowa 33
01-208 Warszawa

tel. 22 395 88 30
tel/fax 22 395 88 49
e-mail: biuro@geotechnology.pl