Michał Jasiorowski

Michał Jasiorowski Inżynier ds.
oprogramowania

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Chciałbym poruszyć dyskusję na temat (nowej) architektury/wzorca CQRS. Co sądzicie o tym podejściu, czy ktoś z Was już z tego korzystał w większym projekcie, może ktoś zamierza?

Dla niezorientowanych polecam szybki wstęp: http://www.udidahan.com/2009/12/09/clarified-cqrs/
Oraz inne źródła dostępne w internecie (Fowler, Udi Dahan, Greg Young).

Moim zdaniem temat bardzo ciekawy oraz wart zapoznania się z nim. Jest to jakaś alternatywa dla systemów w architekturze N-Tier.

Zapraszam do komentowania :)

konto usunięte

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Temat Ciekawy.

Ale z czym jest to lepsze od N-TIER czy Middleware Tier?

W obecnym projekcie mamy coś podobnego tylko że można to sobie wyobrazić jako pojedynczy komponent AC który zarządza innymi komponentami biznesowymi (BM).

Można tą architektura porównać do N-middleware gdyż każdy AC potrafi działać w dokładnie w taki sposób, ale dodatkowo działa jak moduł biznesowy.

Problem z tą architekturą polega na tym że dodaje wiele warstw złożoności, co przy systemie, który ma szybko reagować na zmiany będzie to problemem vs N-Tier czy Middldeware Tier (w middleware tier już ciężko jest reagować na zmiany).

Aby w ogóle rozważać użycie tego modelu zadałbym sobie następujące pytania na które nie znam odpowiedzi w odniesieniu do tej architektury.

1. Jak to ma się do skomplikowanych Workflowów?

- Zakłada to że przepływ będzie wykonywany przez komponenty AC oparte na kolejkach, jak powinniśmy śledzić taki przepływ efektywnie?

2. Błędy?

- Komponent AC posiada błąd, który jest wysyłany do innego AC, błąd jest propagowany w innych AC, gdzie kolejne moduły AC mogą generować kolejne błędy. Jak efektywnie zlokalizować błędy?

- Co z błędami w kolejkach?

- Co z synchronizacją? jeśli z jakiego powodu dostaniemy taki błąd to katastrofa.

3. Change?

- Zakładając że aplikacja wymaga zmiany w 4 AC, jak szybko możemy zaimplementować zmianę?
Grzegorz Kożuchowski

Grzegorz Kożuchowski Prezes Zarządu GoPOS
Sp. z o.o. / CEO
UpVision

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Według mnie temat ciekawy. Kilka polskich blogów traktujących o CQRS i DDD:
http://art-of-software.blogspot.com/
http://simon-says-architecture.com/

Temat mnie zaciekawił w związku z czym postanowiłem napisać pracę inżynierską w oparciu o architekturę CQRS i styl DDD z przykładową aplikacją w JAVIe.

Myślę że koncepcja podzielenia odczytu i zapisu jest bardzo dobra. Według mnie porządkuje ona aplikację oraz wpływa znacząco na wydajność.

btw. jak będę miał gotową pracę to postaram się ją tutaj udostępnić.
Michał Jasiorowski

Michał Jasiorowski Inżynier ds.
oprogramowania

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Bartosz Adamczewski:
Temat Ciekawy.

Ale z czym jest to lepsze od N-TIER czy Middleware Tier?

Ok, być może źle mnie zrozumiałeś. Nie napisałem, że lepszy, tylko, że jest alternatywą dla architektury N-Tier dla specyficznych aplikacji.
Bartosz Adamczewski:
Problem z tą architekturą polega na tym że dodaje wiele warstw złożoności, co przy systemie, który ma szybko reagować na zmiany będzie to problemem vs N-Tier czy Middldeware Tier (w middleware tier już ciężko jest reagować na zmiany).

Zgadzam się, jest ona dużo bardziej złożona (i cięższa w implementacji) niż N-Ter, jednak tak jak można przeczytać w artykułach wymienionych wcześniej autorów w ponad 90% przypadków można znaleźć i użyć lepszej niż ta.
Jej przewagę widać w systemach które muszą posiadać bardzo dużą skalowalność, dużą dostępność oraz posiadają skomplikowaną domenę.
Bartosz Adamczewski:
1. Jak to ma się do skomplikowanych Workflowów?

Tu generalnie wchodzimy w obszary związane z DDD i tym jak jest to adresowane przy użyciu tego podejścia (usługi domenowe itp.)

Bartosz Adamczewski:
2. Błędy?

Moim zdaniem problemy z propagacją błędów w systemie są na podobnym poziomie co w przypadku systemów z inną architekturą.

Jeśli chodzi o synchronizację, to nie do końca wiem o jaką Ci chodzi, jeśli synchronizacja domeny oraz bazy Query, to raczej jest kwestia odpowiedniego zastosowania transakcji (np. zapis obiektu domenowego w tej samej transakcji co publikacja zdarzenia na szynę oraz odczyt z szyny po stronie Query w tej samej transakcji co zapis do bazy Query)

Błędy w kolejkach, mogą wystąpić w każdym systemie który wykorzystuje system kolejek.
Bartosz Adamczewski:
3. Change?

Tu akurat wydaje mi się, że bardzo szybko ponieważ możemy w bardzo dużym stopniu zrównoleglić prowadzone prace (dzięki temu, że poszczególne AC są niezależne i często posiadają zupełnie oddzielne modele dziedzinowe).

Dodatkowo zmiany są bezpiecznie ponieważ jest tu bardzo duży stopień Separation of Concerns, co pozwala na wykonywanie punktowych zmian.

Dodatkowo, jednym z założeń tego podejścia jest to, że w domenie umieszczamy procesy biznesowe które bardzo często mogą się zmieniać a ponieważ ten kawałek systemu powinien być najbardziej przetestowany, zautomatyzowany i pisany przez najlepszych ludzi w zespole mamy bardzo duże szanse na bezpieczną zmianę.

Zgodzę się z Grzegorzem, że CQRS znacząco porządkuje system i jego logikę a jeśli chodzi o wydajność, to jest to jeden z podstawowych zysków z zastosowania tej architektury.

konto usunięte

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Michał Jasiorowski:
Bartosz Adamczewski:
Temat Ciekawy.

Ale z czym jest to lepsze od N-TIER czy Middleware Tier?

Ok, być może źle mnie zrozumiałeś. Nie napisałem, że lepszy, tylko, że jest alternatywą dla architektury N-Tier dla specyficznych aplikacji.
Zgadzam się, jest ona dużo bardziej złożona (i cięższa w implementacji) niż N-Ter, jednak tak jak można przeczytać w artykułach wymienionych wcześniej autorów w ponad 90% przypadków można znaleźć i użyć lepszej niż ta.
Jej przewagę widać w systemach które muszą posiadać bardzo dużą skalowalność, dużą dostępność oraz posiadają skomplikowaną domenę.

Generalnie rozumiem to podejście. Natomiast poza wydajnością o której napisałeś nie widzę więcej potencjalnych korzyści, które różniły by tą architekturę od middleware (przez middleware rozumiem komponent kolejkujący i wysyłający requesty dalej do modułów, wyobraź to sobie jak pojedyncze AC).

---

1. Co do propagacji błędów to w przypadku middleware błąd będzie propagowany tylko tam gdyż nawet jeśli moduł będzie wymuszał flow obejmujący wiele innych modułów i tam wystąpi błąd to wszystkie te kroki będą obsługiwane przez middleware i logowane więc propagacja błędu zatrzyma się tam (nawet jeśli błędne dane będą przesłane dalej), więc taki błąd będzie wykrywalny bardzo szybko.

w przypadku CQRS taka propagacja jest możliwa po przez implementacje w każdym AC event publishera do tzn monitor AC, co komplikuje implementacje jako że ta funkcjonalność jest out of the box w middleware, więc suma sumarum jest to wykonalne i widzę ogromne korzyści że można po prostu napisać takie AC ale złożoność i czas na to potrzebny rośnie.

2. Kolejnym potencjalnym problemem, który widzę to tak jak powiedziałeś każdy AC będzie posiadał swoją domenę więc w przypadku komunikacji wielu AC dane muszą być konwertowane na domenę tego AC, czy nie lepiej w takim razie mówić o danych niż mówić o domenach, oraz manipulować danymi niż domenami?. Inaczej jeśli logika będzie wymagać uwikłania wielu AC to dane będą musiały być reprezentowane za każdym razem inaczej w kontekście danej domeny.

Jest oczywiście jak najbardziej możliwe uogólnienie domeny tak aby wszędzie manipulacja danymi przebiegała w ten sam sposób ale to łamie troszkę idee tego wzorca.

3. Dlaczego komendy powinny sięgać do bazy?, komenda powinna być bardzo lekka oraz nie sięgać nigdzie wg mnie. W przypadku CQRS żeby utworzyć komendę musimy sięgnąć do bazy co wydaje mi się zbędne.

Komenda wg powinna zawierać tylko komendę :-) i to wszystko, resztę AC odczyta z requesta, który dostanie wtedy AC powinien dopiero walidować komendę w kontekście danych to wg może znajdować się w bazie, Autor dodatkowo sugeruje że komendy to osobne solucje więc czy należy to rozumieć że komendy będą mieć jakaś skomplikowaną implementacje? Jeśli tak to taki podeście wydaje mi się zbyt skomplikowane.

W przypadku middleware komendy są lekkie i powiązane z requestem, to middleware je waliduje oraz wie co z nimi zrobić, tam następuje sprawdzenie z bazą, we komenda może zarządzać wykonania pewnej operacji, która zawiera skomplikowaną logikę oparta na odpowiedziach z modułu ale taki operation set jest trzymany po stronie bazy bądź plików w middleware.

Podsumowując architektura jest bardziej skomplikowana, ale daje w zamian kilka ciekawych rzeczy jak kompletne rozproszenie, jednak osobiście dla mnie zbyt skomplikowana to co osobiście bym zrobił to szukał miejsc gdzie można ją znacznie uprościć, bo doświadcznie pokazuje że już prostsze architektury przy +5 mln lines of code robią się zbyt skomplikowane oraz odporne na zmiany :-).
Grzegorz Kożuchowski

Grzegorz Kożuchowski Prezes Zarządu GoPOS
Sp. z o.o. / CEO
UpVision

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Ja myślę że nie wszystko trzeba wyciągać z CQRS - a można to co akurat pasuje do projektu. Mi się bardzo podoba odseparowanie odczytu danych od ich zapisu.

Robiąc projekt w CQRS mam zamiar podzielić aplikację na 3 warstwy (poziome):
1. prezetnacji (czyli odczyt danych)
2. Warstwa ze skomplikowana domena (zastosowanie DDD)
3. Proste operacje CRUD.

Dzięki takiemu podziałowi najlepsi zajmują się punktem 2 (z wiadomych przyczyn), a operacje CRUD czy odczyt danych to może zająć się student z podstawową wiedzą tak naprawde.

konto usunięte

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Chciałbym poruszyć dyskusję na temat (nowej) architektury/wzorca CQRS. Co sądzicie o tym podejściu,

Myślę, że firmy / osoby zajmujące się szkoleniami i certyfikacją nie powinny (konflikt interesów) zajmować się tworzeniem nowych metodyk / wzorców :)
Maciej Aniserowicz

Maciej Aniserowicz software
developer/architect

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Moim zdaniem to bardzo ciekawa koncepcja niosąca bardzo wiele korzyści. Nie miałem jeszcze okazji zastosować tego w "prawdziwym projekcie", ale małe eksperymenty ( https://github.com/maniserowicz/ProcentCqrs ) wypadły pozytywnie i nie mogę się doczekać aż kiedyś uda się to zastosować komercyjnie.
Sceptycznie podchodzę do Event Sourcing - pewnie ciężko byłoby przekonać wielu adminów że nagle tracą możliwość ręcznego pogrzebania w bazie w celu zrobienia tego, czego nie udostępnia UI. Ale separacja read model (lekki generator SQL na odpowiednie widoki w bazie lub drugą bazę) i write model (domena + NH) sprawdziłaby się moim zdaniem znakomicie w większości projektów. Właśnie kilkudniowa zabawa pokazała mi, że takie podejście wyeliminowałoby sporo problemów z którymi borykałem się w przeszłości (nieuzasadnione code reuse, skomplikowane zapytania w ORM, udostępnianie prawdziwego modelu reszcie systemu tylko do celów prezentacyjnych/filtrowania, powtarzające się niekiedy testy jednostkowe na różnych warstwach systemu etc...).

Jakub Wojt:

Myślę, że firmy / osoby zajmujące się szkoleniami i certyfikacją nie powinny (konflikt interesów) zajmować się tworzeniem nowych metodyk / wzorców :)

Że w sensie kto, że Udi czy Greg?? Chyba nie do końca orientujesz się w takim razie czym oni się zajmują. Jeśli tacy geniusze mieliby nie wyznaczać nowych ścieżek... to kto? Bez sensu.

konto usunięte

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Moim zdaniem to bardzo ciekawa koncepcja niosąca bardzo wiele korzyści.

Wolałbym listę :)
Nie miałem jeszcze okazji zastosować tego w "prawdziwym projekcie", ale małe eksperymenty ( https://github.com/maniserowicz/ProcentCqrs ) wypadły pozytywnie i nie mogę się doczekać aż kiedyś uda się to zastosować komercyjnie.

...
[...] Ale separacja read model (lekki generator SQL na odpowiednie widoki w bazie lub drugą bazę) i write model (domena + NH) sprawdziłaby się moim zdaniem znakomicie w większości projektów.

komercyjnych ?
tzn wiem, że to dwie różne rzeczy które można rozdzielić ale .... jak to zrobić tak, żeby 'było lepiej' ?
Właśnie kilkudniowa zabawa pokazała mi, że takie podejście wyeliminowałoby sporo problemów z którymi borykałem się w przeszłości (nieuzasadnione code reuse,

tzn te same zapytania po stronie logiki i view ?
skomplikowane zapytania w ORM,

w view czy logice ?
udostępnianie prawdziwego modelu reszcie systemu tylko do celów prezentacyjnych/filtrowania,

View służy do udostępniania 'prawdziwego' modelu.
powtarzające się niekiedy testy jednostkowe na różnych warstwach systemu etc...).

proszę o personalia projektanta :)
Myślę, że firmy / osoby zajmujące się szkoleniami i certyfikacją nie powinny (konflikt interesów) zajmować się tworzeniem nowych metodyk / wzorców :)

Że w sensie kto, że Udi czy Greg?? Chyba nie do końca orientujesz się w takim razie czym oni się zajmują.

A co mnie to obchodzi ? Wystarczy że wiem, czym ja się zajmuję (?) :)
Dlatego w kwestii CQRS, póki co, jestem na 'nie' :)
Maciej Aniserowicz

Maciej Aniserowicz software
developer/architect

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Jakub Wojt:
Moim zdaniem to bardzo ciekawa koncepcja niosąca bardzo wiele korzyści.

Wolałbym listę :)

Listę znajdziesz na każdej stronie o CQRS, Michał na początku też podał punkty zaczepienia. Zresztą teraz byłbym skłonny wnioskować, że skoro odrzucasz tą koncepcję to wiesz co ona oferuje.
[...] Ale separacja read model (lekki generator SQL na odpowiednie widoki w bazie lub drugą bazę) i write model (domena + NH) sprawdziłaby się moim zdaniem znakomicie w większości projektów.

komercyjnych ?

Ogólnie - wszystkich. Co za różnica czy komercyjnych czy hobbystycznych?:)
Właśnie kilkudniowa zabawa pokazała mi, że takie podejście wyeliminowałoby sporo problemów z którymi borykałem się w przeszłości (nieuzasadnione code reuse,

tzn te same zapytania po stronie logiki i view ?

Nie tyle zapytania, co wykorzystanie tych samych struktur. Tymczasem bardzo upraszcza sprawę odróżnienie klasy domenowej "User" od np. klasy widoku "UserForAdministrationView".
skomplikowane zapytania w ORM,

w view czy logice ?

W view. CQRS pokazuje, że po stronie logiki właściwie w ogóle nie potrzeba zapytań. A po stronie view będzie to "select * from [...]".
udostępnianie prawdziwego modelu reszcie systemu tylko do celów prezentacyjnych/filtrowania,

View służy do udostępniania 'prawdziwego' modelu.

No właśnie nie. View służy do udostępniania odpowiednio spreparowanych danych będących wynikiem operacji na 'prawdziwym' modelu.
powtarzające się niekiedy testy jednostkowe na różnych warstwach systemu etc...).

proszę o personalia projektanta :)

Yours truly.
Myślę, że firmy / osoby zajmujące się szkoleniami i certyfikacją nie powinny (konflikt interesów) zajmować się tworzeniem nowych metodyk / wzorców :)

Że w sensie kto, że Udi czy Greg?? Chyba nie do końca orientujesz się w takim razie czym oni się zajmują.

A co mnie to obchodzi ? Wystarczy że wiem, czym ja się zajmuję (?) :)

Skoro piszesz, że ktoś nie powinien zajmować się rzeczą X ponieważ zarabia na rzeczy Y, to wypadałoby orientować się co to jest X, co to jest Y i kto to jest ten ktoś. Krytykujesz zajmowanie się X podczas gdy nie obchodzi cię czym jest Y...
Dlatego w kwestii CQRS, póki co, jestem na 'nie' :)

Polecam dokładniejsze przyjrzenie się tej architekturze, choćby hobbystycznie, z ciekawości.

konto usunięte

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Moim zdaniem to bardzo ciekawa koncepcja niosąca bardzo wiele korzyści.

Wolałbym listę :)

Listę znajdziesz na każdej stronie o CQRS, Michał na początku też podał punkty zaczepienia. Zresztą teraz byłbym skłonny wnioskować, że skoro odrzucasz tą koncepcję to wiesz co ona oferuje.

Autorska definicja CQRS: http://codebetter.com/gregyoung/2010/02/16/cqrs-task-b...

:)
Michał Jasiorowski

Michał Jasiorowski Inżynier ds.
oprogramowania

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Powyższy post oznaczyłem jako wartościowy przypadkowo :)

konto usunięte

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Michał Jasiorowski:
Powyższy post oznaczyłem jako wartościowy przypadkowo :)

Ok, to zwracam ;)

konto usunięte

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Jako ciekawostka:

Na Abb Dev Day Szymon Pobiega prezentowal ciekawa autorska koncepcję połaczenia CQRS i REST. http://www.abb.pl/cawp/plabb045/c3ef4f9cd35e8dcec12579...

Nie moge natomiast nigdzie znalezc tej prezentacji, ani info o rezultacie konkursu polegajacego na implementacji powyzszej architektury. Jak ktos jest zainteresowany to najlpiej niech sam pisze do Szymona
Maciej Aniserowicz

Maciej Aniserowicz software
developer/architect

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Prezentacja podlinkowana w tym poście: http://simon-says-architecture.com/2011/10/20/abb-dev-...
Michał Jasiorowski

Michał Jasiorowski Inżynier ds.
oprogramowania

Temat: CQRS (Command Query Responsibility Segregation), wasze...

Tak, żeby nie było że jestem stronniczy i mam klapki na oczach dot. CQRS poniżej link do wpisu Udi'ego dot. CQRS i czemu nie powinno się go używać (wiele słusznych uwag, nie tylko dot. specyficznie CQRS) :)

http://www.udidahan.com/2011/04/22/when-to-avoid-cqrs/

Jak ze wszystkim, należy używać z głową!



Wyślij zaproszenie do