Wprowadzenie do CQRS

Nadszedł czas, żeby omówić CQRS o którym ostatnio zrobiło się głośno ostatnio głównie przez Pana który zwie się Udi Dahan.


Wstęp

Z CQRS dużo jest związanych pojęć typu np takie jak NoSQL, DDD czy event sourcing i o tym wszystkim powstanie później materiał jednak póki co skupie się na CQRS.


Zwykły model

Jak z tytułu podpunktu wynika, najpierw porównam te dwa pojęcia i następnie ty czytelniku zdecydujesz czy CQRS ma sens.

Zwykły model wygląda tak:

Czyli jest sobie klient i jeden model. Klient wysyła zapytania, model zwraca odpowiedź. Zwykle tak to wygląda.

Problem z tym jest taki, że cała logika jest w jednym model, którego logika nie jest w specjalny sposób rozdzielona i później wynikają z tego takie jaja, że nie da się tego przetestować ani rozwijać w miare sensowny sposób lub debugowanie tego to istna rzeźnia.

Wiadomo zależy też od tego jak kto napisze ten model, ale jako, że zwykle wszystko tam jest w jednym modelu to jest tam pomieszane z poplątanym…

Jest na to sposób, żeby to rozwiązać i tym rozwiązaniem jest właśnie CQRS.


Podejście CQRS

Natomiast w CQRS wygląda to tak:

Co to ma być? Model jest rozdzielony na dwie strony do odczytu i zapisu. Ze strony zapisu idą wszystkie komendy służące do operacji na bazie danych do zapisu. Dobrze też nakreślić, że CQRS posiada dwie zdefiniowane bazy danych do odczytu i zapisu.

W bazie danych do zapisu są wszystkie najważniejsze dane są one o tyle ważne, że jeśli coś tam się zmieni(tak jak widać na schemacie powyżej) wysyłany jest event, że coś się wydarzyło w systemie i ten event jest zapisywany do bazy danych do odczytu, można powiedzieć, baza danych do odczytu jest takim jakby cachem aplikacji oraz jest powiązana z event sourcingiem(o event sourcingu i bazie danych jako cache później).

A CQRS bardziej szczegółowo z podziałem na konkretne klasy wygląda tak:

Czyli ze strony do odczytu idzie zapytanie i otrzymujemy po krótkim czasie odpowiedź tu sposób implementacji po stronie odczytu jest dowolny, jest to dosyć proste.

Po stronie do zapisu wysyłamy komendę, która idzie do CommandBus-a. Klasa CommandBus służy do przydzielania odpowiednich komend do odpowiednich klas, które je obsługują, czyli handlerów tych klas a każda komenda może mieć tylko jeden handler.

Następnie po obsłużeniu tych komend zapisujemy dane w bazie danych oraz w repozytorium i zmieniamy naszą logikę tzw Domain object, czyli w skrócie nasz logikę biznesową. Termin Domain object pochodzi właśnie z DDD, ale o DDD kiedy indziej.

Potem kiedy nastąpi koniec operacji na tych wszystkich danych wysyłamy event do EventBus-a, który przydziela odpowiednie eventy do odpowiednich handlerów tych eventów i zapisujemy zmiany do bazy danych.

Pytanie za sto punktów. Wiesz czytelniku co ta Pani ma wspólnego z CQRS?

Może zgadłeś… Tak, zapisuje i odczytuje dane, widać, że stosuje CQRS-a od lat z powodzeniem 🙂 Ale taka w wielkim skrócie wygląda cała koncepcja CQRS.

Tak jak wspominałem mam prezentacje o CQRS niedługo i tam przygotowałem praktyczny przykład prototypu systemu bankowego wykorzystującego CQRS w połączeniu z event sourcingiem. W następnym artykule już przejde konkretnie do kodu i zachacze o bazy danych Microsoftu MSServer, ponieważ tą baze wykorzystałem do tego projektu.

Później gdy opisze ten projekt warto spiąć razem stronę zapisu i odczytu kontenerem dependency injection, żeby to wszystko ładnie poukładać, zarejestrować wszystkie klasy w systemie.

W CQRS można też używać asynchroniczności. W szczegółach implementacyjnych ludzie się spierają, że CQRS bez asynchroniczności jest bez sensu z czym się nie zgadzam. W CQRS można stosować synchroniczność dopóki nie ma żadnych problemów z wydajnością.

Również komendy powinny być typu void i nie mają nic zwracać z czym ludzie niektórzy też się nie godzą „no bo przecież komenda musi zwracać rezultat”. Stosuje się do takich metod w komendzie wyjątki, ale o wyjątkach napisze w następnych artykułach.


Podsumowanie

W następnym artykule przejdziemy już do kodu.

Standardowo, przypominam o newsletterze, którym wysyłam powiadomienia o nowych wpisach oraz dodatkowe informacje na temat, ogółem mówiąc, świecie IT.

KONIECZNIE dołącz do społeczności DevmanCommunity na fb, części społeczności jest w jednym miejscu 🙂

-strona na fb: Devman.pl-Sławomir Kowalski

-grupa na fb: DevmanCommunity

Pytaj, komentuj pod spodem na końcu wpisu, podziel się nim, oceń go, rób co wolisz 

 
Jeśli ten wpis ci się przydał podziel się nim ze swoimi znajomymi :)

Post a comment

avatar
  Subscribe  
Notify about