Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: CQRS czyli co....

Po ponad pół roku edukacji w kierunku DDD, połknięciu książki Erica Evansa i po przeczytaniu niezliczonej ilości opracowań, łącznie z serią z bottega.com(przytoczoną przez Łukasza) muszę stwierdzić, że CQRS ma sens i to zaskakująco duży. Popełniłem podobny projekt na którym się uczę i efekty są bardzo zachęcające.
Przede wszystkim DDD koncentruje się na optymalizacji i ekspresji głównego modelu dziedziny. Podejście te ignoruje całkowicie zagadnienia prezentacji i persystencji, co przy nieodpowiedniej realizacji technologicznej może skończyć się tragedią wydajnościową. Jeśli korzystamy z grubych agregatów do tworzenia widoku to zaatakuje nas wiele problemów:
- sztandarowe N+1 select problem
- jeśli zaczniemy optymalizować agregaty pod kątem wydajności bazodanowej, to zaprzeczymy całej idei DDD i zmarnujemy cała pracę polegającą na czystym wyrażeniu domeny
- lazy loading wcale nie jest złotym rozwiązaniem tych problemów, owszem może pomóc, ale tak niesie z sobą narzut wydajnościowy, ale co najgorsze... przeciąga zakres transakcji, ponieważ wszystkie lazy pola muszą być zaciągnięte w managed encjach
- naruszamy enkapsulację agregatów bo wyciągamy z nich dane getterami

CQRS rozwiązuje ten bolączki bazując na spostrzeżeniu, że agregaty nie są do niczego potrzebne przy tworzeniu widoków. Jest to niejako obejście modelu dziedzinowego, który odpowiada za operacje biznesowe.
Nie mogę zgodzić się z wieloma twierdzeniami, które tutaj przeczytałem, w szczególności:

1.) potrzebny jest kolejny model i przez to dublujemy tą samą logikę
Rzeczywiście, pracy jest trochę więcej, bo musimy zaimplementować odpowiednie DAO, które wyciągnie dane z bazy, ale już nie przy użyciu agregatów. DTO dla widoku i tak musi powstać, więc możemy je użyć jako nośnik danych używany przez query interface(CQRS wcale nie narzuca konkretnego modelu query, to już zależy od potrzeb). Podsumowując roboty dodatkowej nie jest aż tak dużo jak się wydaje i jest to proste "klepanie", które dziecinnie łatwo przetestować i implementować. NIE jest to to samo co implementacja domeny, to są dwie całkowicie różne rzeczy.

2.) zmiana db pociągnie lawinę zmian w query modelu
Nie pociągnie... od tego jest abstrakcja uzyskiwana przez obiekty DTO widoku, żeby sposób ich uzyskiwania był przykryty z perspektywy GUI. Jeśli zmieni się silnik danych, czy zrefactorujemy agregat, to zmieni się jedynie implementacja dao wciągającego te dane, z tym muszę się zgodzić. Jeśli chodzi o poważniejszą zmianę modelu (np. dodane zupełnie nowych danych), to już tutaj żadna abstrakcja nie pomoże i będzie potrzebna zmiana we wszystkim od domeny, przez bazę po widok.

3.) wymusza wyciąganie logiki biznesowej do widoku
Moim zdaniem całkowicie błędny argument, wynikający z nieprawidłowej klasyfikacji niektórych zagadnień aplikacji. Proszę o dokładnie wytłumaczony i konkretny przykład takiej sytuacji, ponieważ jakoś nie potrafię sobie wyobrazić, żeby aspekt widokowo/raportowy nagle potrzebował wykonywać funkcję z core domain.

4.) nie ma różnicy ile interfejsów zastosujemy, ważna jest ilość maszyn
Nie jest to prawdą, w standardowych systemach biznesowych ponad 95% kontaktu z bazą danych to zapytania, nie modyfikację. Maksymalna optymalizacja zapytań ma sztandarowe znaczenie dla wydajności systemu i CQRS pozwala nam w bardzo przejrzysty sposób oddzielić oba aspekty. Daje to ogromne pole do popisu dla specjalistów od baz danych, którzy mogą zoptymalizować bazę danych pod zapytania, używając np. eventual consistency. Inaczej mówiąc CQRS pozwala wprowadzić aplikację pisaną pod programistów (DDD), w świat największej wydajności, w której nawet najbardziej hardcorowe techniki optymalizacyjne są możliwe.

CQRS w gruncie rzeczy daje nam możliwości architekturalne, nie zabierając na początku niczego. Nikt nam nie zabrania w pierwszej wersji aplikacji użyć grubych agregatów do implementacji query interface... Sposób tworzenia DTO jest zakryty, a widoku nie obchodzi skąd dostaje dane. W ten sposób masz namiastkę CQRS, bez jakichkolwiek konsekwencji. Jedna różnica, to posegregowane interfejsy. Jeśli chcesz większą wydajność to używasz HQL lub SQL. Im niższej implementacji użyjemy tym bardziej wiążemy naszą implementację query interface z bazą, ale też zwiększamy wydajność. To kiedy w tym procesie się zatrzymamy zależy tylko wyłącznie od nas i to jest chyba w tym wzorcu najlepsze.

konto usunięte

Temat: CQRS czyli co....

Po ponad pół roku edukacji w kierunku DDD, połknięciu książki Erica Evansa i po przeczytaniu niezliczonej ilości opracowań, łącznie z serią z bottega.com(przytoczoną przez Łukasza) muszę stwierdzić, że CQRS ma sens i to zaskakująco duży.

Widziałem sensy, które były większe :)
Popełniłem podobny projekt na którym się uczę i efekty są bardzo zachęcające.
Przede wszystkim DDD koncentruje się na optymalizacji i ekspresji głównego modelu dziedziny.
Podejście te ignoruje całkowicie zagadnienia prezentacji i persystencji,

Całkiem słusznie.
co przy nieodpowiedniej realizacji technologicznej może skończyć się tragedią wydajnościową.

Jak wszystko.
Jeśli korzystamy z grubych agregatów do tworzenia widoku to zaatakuje nas wiele problemów:

Związanych głównie z niewiedzą nt. technologii.

CQRS to taki pomysł osoby bez wiedzy technicznej, na rozwiązywanie problemów natury technicznej.
CQRS rozwiązuje ten bolączki bazując na spostrzeżeniu, że agregaty nie są do niczego potrzebne przy tworzeniu widoków.

To samo pomyśleli twórcy baz danych i dlatego stworzyli takie coś jak "widoki" (views).
Jest to niejako obejście modelu dziedzinowego, który odpowiada za operacje biznesowe.
Nie mogę zgodzić się z wieloma twierdzeniami, które tutaj przeczytałem

Nie szkodzi :)
CQRS w gruncie rzeczy daje nam możliwości architekturalne, nie zabierając na początku niczego.

No tak; architektura daje możliwości architektoniczne i jednocześnie pozwala na tworzenie dowolnej architektury.

Weź se zostań jakim managerem, ok ? I wara od programowania :)
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: CQRS czyli co....

Jakub W.:
CQRS w gruncie rzeczy daje nam możliwości architekturalne, nie zabierając na początku niczego.

No tak; architektura daje możliwości architektoniczne i jednocześnie pozwala na tworzenie dowolnej architektury.

Weź se zostań jakim managerem, ok ? I wara od programowania :)

Jakub, zastanów się co robi np. magazynier:
- ma kartoteki towarowe zawierające detaliczne dane o produktach (złożone agregaty)
- ma także "zeszycik" zawierający kluczowe dane: nazwa, cena, ilość

To jest CQRS: dodajesz dodatkowa tablicę (zeszycik) tylko po to by nie babrać się w opasłych kartotekach, bo bardzo wiele pytań do magazyniera to tylko pytania o to ile ma i po ile...

Z perspektywy modelu dziedziny, taki zeszycik może być widokiem zmaterializowanym, nie ma to znaczenia, bo "od góry" widać i pełne agregaty i uproszczona płaską tablice (widok) czy "dwa" zestawy danych o tym samym", tu jednak będzie problem, bo szybkie wyświetlenia cennika z magazynu czasem może taka strukturę zabić... zaś optymalizacja "prawdziwych agregatów" po protu je zniszczy i kolega moim zdaniem ma rację pisząc to co napisał...

Inna sprawa, ze w sieci jest masa bełkotu o CQRS,
Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: CQRS czyli co....

Jakub W.:
Jeśli korzystamy z grubych agregatów do tworzenia widoku to zaatakuje nas wiele problemów:

Związanych głównie z niewiedzą nt. technologii.

Masz tutaj bardzo dużo racji, znaczna większość ślimaczych ORMów zasługa nieprawidłowego użycia ORM. Jednak nie zmienia to faktu, że w wyciąganiu pojedynczych pól ze skomplikowanego grafu obiektów, native SQL zawsze będzie szybszy (jak zrobisz model, który działa tak szybko jak zdenormalizowana baza na SQL to dostaniesz nobla).
No tak; architektura daje możliwości architektoniczne i jednocześnie pozwala na tworzenie dowolnej architektury.

Chciałem powiedzieć, że CQRS jest tylko rozdzieleniem interfejsów, które później pozostawia furtkę na ewentualną optymalizację.
Weź se zostań jakim managerem, ok ? I wara od programowania :)

Dzięki za sugestię, ale na razie nie planuje zmiany ścieżki kariery :) Ja też chciałbym coś Tobie zasugerować, radził bym odejść od wstawek personalnych. Rozmawiamy tutaj o technologii, a zauważyłem że bardzo lubisz oceniać lub dyskredytować osobę zamiast argumentować.

Muszę szczerze powiedzieć, że całkowicie rozumiem twój punkt widzenia i też uważam, że poprawne obiektowe modele i odejście od database-driven-designu jest bardzo potrzebne. Niestety takie podejście nie zawsze spełni wszystkie oczekiwania. Mam świadomość tego, że implementacja SQLowa obok ORM nie wpłynie pozytywnie na utrzymywalość systemu, ale czasem nie ma innego wyjścia. CQRS pozwala zminimalizować problemy, kiedy już trzeba to zrobić (co najważniejsze, chroni domenę).

Prosiłbym też o przykład, kiedy CQRS spowoduje wyciągnięcie logiki domenowej do widoku, czyli o wytłumaczenie jednego z głównych postulatów przeciwko CQRS.
Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: CQRS czyli co....

Jarek Ż.:
[...]
wyświetlenia cennika z magazynu czasem może taka strukturę zabić... zaś optymalizacja "prawdziwych agregatów" po protu je zniszczy [...]

Dokładnie od tego spostrzeżenia zacząłem interesowanie się CQRS. Co więcej... w końcu można pozbyć się getterów z obiektów biznesowych zapewniając im pełną enkapsulację. Te zagadnienie kuło mnie w oczy już od dawna, bo robienie jakichkolwiek akcesorów od początku śmierdziało, teraz już wiem dlaczego.
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: CQRS czyli co....

moim zdaniem wiele złego czynią w kwestii CQRS opisy CQRS jako "dwóch metodach dostępu do tych samych danych" i wtedy Jakub jak najbardziej ma, moim zdaniem rację, to bez sensu. Jeżeli jednak uznamy, ze do dwóch celów mamy "dwa odrębne sposoby zapisu danych o tym samym" diametralnie zmienia postać rzeczy

konto usunięte

Temat: CQRS czyli co....

Jeśli korzystamy z grubych agregatów do tworzenia widoku to zaatakuje nas wiele problemów:

Związanych głównie z niewiedzą nt. technologii.

Masz tutaj bardzo dużo racji, znaczna większość ślimaczych ORMów zasługa nieprawidłowego użycia ORM. Jednak nie zmienia to faktu, że w wyciąganiu pojedynczych pól ze skomplikowanego grafu obiektów, native SQL zawsze będzie szybszy (jak zrobisz model, który działa tak szybko jak zdenormalizowana baza na SQL to dostaniesz nobla).

ORM, bazy danych i generalnie - technologii.
Proszę o rozwinięcie reszty ponieważ jest tak zamotana, że nie wiem jak sensownie (tzn. zawszę mogę bezsensownie, ale tego chciałbym uniknąć) mógłbym odpowiedzieć.
No tak; architektura daje możliwości architektoniczne i jednocześnie pozwala na tworzenie dowolnej architektury.

Chciałem powiedzieć, że CQRS jest tylko rozdzieleniem interfejsów, które później pozostawia furtkę na ewentualną optymalizację.

Ale mówisz o tym CQRS Grega Younga czy Udi Dahana ?

Bo jeśli o tym pieszym, to nie chodzi o żadną optymalizację, a o "odautystycznienie" interfejsów.
W drugim przypadku - nie wiem o co chodzi - chyba o to, jak fajnie się tworzy wzorce "na narkotykach".

W każdym bądź razie - nie będzie to ani wydajne, ani łatwe do napisania. O tym, że nie będzie w ogóle działać chyba pisać nie muszę.

http://codebetter.com/gregyoung/2010/02/16/cqrs-task-b...
Weź se zostań jakim managerem, ok ? I wara od programowania :)

Dzięki za sugestię, ale na razie nie planuje zmiany ścieżki kariery :)

Mówię serio - potrafisz elegancko rozpisywać się o rzeczach o których chyba nie masz (i nie możesz mieć biorąc pod uwagę Twój 'staż') większego pojęcia. Poza tym ładnie prezentujesz się w garniturze (zdjęcie w profilu). Jeśli jeszcze masz wzrost > 185cm to gwarantuję - będziesz świetnym managerem. Ktoś w końcu musi zarządzać ! :)
Ja też chciałbym coś Tobie zasugerować, radził bym odejść od wstawek personalnych. Rozmawiamy tutaj o technologii, a zauważyłem że bardzo lubisz oceniać lub dyskredytować osobę zamiast argumentować.


Muszę szczerze powiedzieć, że całkowicie rozumiem twój punkt widzenia i też uważam, że poprawne obiektowe modele i odejście od database-driven-designu jest bardzo potrzebne.

Nie wiem o co chodzi. Chciałem jedynie napisać że CQRS jest absurdem na kółkach.
Niestety takie podejście nie zawsze spełni wszystkie oczekiwania. Mam świadomość tego, że implementacja SQLowa obok ORM nie wpłynie pozytywnie na utrzymywalość systemu, ale czasem nie ma innego wyjścia.

"Czasem nie ma innego wyjścia jak psucie".
To nawet brzmi jak quote jakiegoś sławnego managera :)

Chciałbym to jakoś inaczej skomentować, ale nie wiem jak.
Kupienie szybszego dysku / dodatkowej pamięci / dobra konfiguracja DB nie będzie rozwiązaniem ?
CQRS pozwala zminimalizować problemy, kiedy już trzeba to zrobić (co najważniejsze, chroni domenę).
Prosiłbym też o przykład, kiedy CQRS spowoduje wyciągnięcie logiki domenowej do widoku, czyli o wytłumaczenie jednego z głównych postulatów przeciwko CQRS.

:) CQRS nigdy - ale po programistach którzy stosują ten absurdalny wzorzec można spodziewać się wszystkiego.
Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: CQRS czyli co....

Jakub W.:

ORM, bazy danych i generalnie - technologii.
Proszę o rozwinięcie reszty ponieważ jest tak zamotana, że nie wiem jak sensownie (tzn. zawszę mogę bezsensownie, ale tego chciałbym uniknąć) mógłbym odpowiedzieć.

Masz sobie agregat X, który odpowiada jakiejś ważnej rzeczy w biznesie. No i ten obiekt ma swoje ID, i jakieś pola stałe, ale też posiada kolekcję encji Y (jeden do wielu), z których każda ma przypisaną słownik dynamicznych atrybutów (po javowemu to będzie Map<String,String>). No i teraz masz widok, który ma dla każdego X, wziąć najnowszy Y i do tego umożliwić przeszukiwanie po atrybutach tego najnowszego Y.

Jeśli zrobisz to programując na agregatach, to będzie trup wydajnościowy i żadna technika ORMowa tu nie pomoże. Jak najnowszy klaster SSD przestanie pomagać to niestety możliwości takiego systemu się kończą.
Ale mówisz o tym CQRS Grega Younga czy Udi Dahana ?

W gruncie rzeczy to jest jedno i to samo, tylko zrealizowane na innym poziomie. Podaj mi proszę różnice, na które tak zwróciłeś uwagę.
W każdym bądź razie - nie będzie to ani wydajne, ani łatwe do napisania. O tym, że nie będzie w ogóle działać chyba pisać nie muszę.

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

No właśnie, przydało by się takie wyjaśnienie. Podałeś link do jednego z wielu opracowań CQRS i zupełnie nie mam pojęcia jak się on ma do Twojej wypowiedzi.
Mówię serio - potrafisz elegancko rozpisywać się o rzeczach o których chyba nie masz (i nie możesz mieć biorąc pod uwagę Twój 'staż') większego pojęcia. Poza tym ładnie prezentujesz się w garniturze (zdjęcie w profilu). Jeśli jeszcze masz wzrost
185cm to gwarantuję - będziesz świetnym managerem. Ktoś w
końcu musi zarządzać ! :)

Tylko na to czekałem, naprawdę nie potrafisz rozmawiać abstrahując od osoby :) Wiem, że mam małe doświadczenie, że wielu rzeczy nie rozumiem i dlatego zaczynam takie rozmowy. Jeśli rzeczywiście się mylę, to tak doświadczonej osobie jak Ty, nie powinna sprawiać żadnej trudności obrona swoich argumentacji. Ja tu jestem po wiedzę i argumenty, nie po to żeby kogoś oceniać, czy grać wielkiego specjalistę.
A zdjęcie jest stare... nie mam 185 cm i utyłem trochę od tego czasu, czy to coś zmienia w sprawie :) ?
:) CQRS nigdy - ale po programistach którzy stosują ten absurdalny wzorzec można spodziewać się wszystkiego.

Ups, znowu ocena rzeczy bazująca na ocenie osoby/osób. Proszę tylko i wyłącznie o obronę twojego argumentu mówiącego, że CQRS powoduje wyciągnięcie logiki z domeny. Obchodzisz ten temat szerokim kołem, ale tak się nie da wiecznie :)
Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: CQRS czyli co....

Jarek Ż.:
"dwóch metodach dostępu do tych samych danych"

Dla przykładu: jedna baza danych z jednym modelem danych, z której raz ciągniemy używając ORMa, a raz SQL.
"dwa odrębne sposoby zapisu danych o tym samym"

A tutaj: dwie bazy(logicznie lub fizycznie), z których jedna jest stawiana pod ORM, druga synchronizuje się z pierwszą i jest dostosowana do potrzeb zapytań.

Czy dobrze zinterpretowałem, to co chciałeś wyrazić ?
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: CQRS czyli co....

Marcin M.:
Jarek Ż.:
"dwóch metodach dostępu do tych samych danych"

Dla przykładu: jedna baza danych z jednym modelem danych, z której raz ciągniemy używając ORMa, a raz SQL.

albo tworzymy np. uproszczony widok zmaterilizowany, to cały czas mielenie tego samego
"dwa odrębne sposoby zapisu danych o tym samym"

A tutaj: dwie bazy(logicznie lub fizycznie), z których jedna jest stawiana pod ORM, druga synchronizuje się z pierwszą i jest dostosowana do potrzeb zapytań.

Czy dobrze zinterpretowałem, to co chciałeś wyrazić ?

dokładnie, z małą uwagą: odpuszczając sobie jedną bazę relacyjna dla całego złożonego systemu na korzyść prostego mapowania obiekt-tablica lub obiekt-rekord (active table lub active record), ten ORM można sobie spokojnie darować bo niepotrzennie komplikuje całość...

tak, mamy całkowicie odrębne dwa zestawy danych: jeden opisujący wiernie produkt drugi to ich uproszczona (szybsza w przeglądaniu) wersja, jednak druga jest generowana z pierwszej. Klasycznym przykładem CQRS jest baza transakcyjna i obok niej hurtownia danych: dwa zbiory danych "o tym samym" jednak pierwszy zawiera wszystkie potrzebne szczegóły a drugi tylko to co potrzebne do pewnego ograniczonego zastosowania jednak z rygorem na szybkość.
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: CQRS czyli co....

ciekawa cegła do przejrzenia (przeczytania ....)
http://msdn.microsoft.com/en-us/library/jj554200.aspxTen post został edytowany przez Autora dnia 23.06.13 o godzinie 10:47
Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: CQRS czyli co....

Jarek Ż.:
[...]

Ok, już rozumiem. To co opisane jest jako opcja druga to najmocniejsza implementacja CQRS, w której tworzona jest oddzielna baza do zapytań. Jest to rozwiązanie końcowe, jeśli potrzebujemy max wydajności i jesteśmy w stanie ponieść koszty dodatkowe związane z takim rozwiązaniem.

Chciałbym jednak porozmawiać o pierwszej opcji. Nawet przy jednym, przystosowanym do obiektów biznesowych schemacie bazy, zastosowanie technologii niższego poziomu może się wiązać ze wzrostem wydajności(przykład w poście do Jakuba obrazuje konkretny przykład). Co więcej, jeśli nie przewidzimy takiej sytuacji w systemie, to później może nas bardzo zaboleć. Załóżmy, że wydajność na jakimś widoku okazuje się z czasem za mała. Niestety jedyną możliwością(pomijam modernizacje sprzętu), która nie będzie wymagała potężnego refaktoringu, to brudne obejście ciężkich obiektów przez ręcznie napisany i nie pasujący do reszty HSQL/nativeSQL. W takim wypadku do ładnego interfejsu repozytorium domenowego wkrada się metoda zwracająca DTO, co wprowadza chaos.
CQRS zakłada segregację interfejsów pomiędzy komendami i zapytaniami już od samego początku. Robiąc to wydzielamy "czysty" interface który zawsze zwraca obiekty domeny, które później służą do operacji biznesowych. Obok niego tworzymy interface do zapytań, w którym jest większa dowolność implementacji i który wypluwa "szyte na miarę" obiekty DTO. Posiadając tak ułożone interfejsy możemy później bezboleśnie przejść na opcję drugą, czyli stworzenie dedykowanej bazy. Moim zdaniem warto...
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: CQRS czyli co....

może prościej, ewolucja dziedziny:
Generalnie wszelkie odwołania do/po informacje ("ciężkie agregaty") obsługuje interfejs Repository (repozytorium), i teraz:
1. wszelkie zapytania wyrabiają siwe w czasie - nic nie robimy
2. są problemy z pewnym zapytaniami - budujemy w modelu dziedziny uproszczoną wersję (jedna "płaska" klasa) "ciężkiego agregatu"

i teraz: jeżeli ta dwie obiektowe wersje będą tak na prawdę "gadały" do tych samych tablic w bazie przez ORM to nie widzę tu sensu, jeżeli obie wersje (encja i agregat) będą miały swoje dedykowane tablice to ma to sens bo, zmiana ta (rozszerzenie jako poprawa wydajnosci systemu) nie wyjdzie "przed" repozytorium czyli reszta systemie nie wie o tej zmianie, system chodzi szybciej bez ingerecji w historię
Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: CQRS czyli co....

No to już chyba zrozumiałem główny problem:

Obiekty DTO dla query modelu są tworzone per widok/raport, nie per agregat.

Dlaczego tak ? Odpowiedź nie jest oczywista na pierwszy rzut oka, ale porównajmy obie opcje na przykładzie skomplikowanego i dużego widoku, który pobiera dane z trzech agregatów, wyświetla dużo wierszy i oczywiście nie korzysta, ze wszystkich danych, które są w agregatach.

1.) W opcji jeden DTO na jeden agregat, żeby zbudować widok trzeba wyciągać 3 DTO na dany wiersz. Teraz mnożąc to razy ilość ogólną wierszy wychodzi na to, że baza i tak cierpi, wcale nie wiele mniej jak w przypadku ciężkich agregatów.
2.) Jeśli mamy DTO na widok, to możemy załatwić wszystko jednym, specjalistycznym zapytaniem zwracającym listę tych DTO. Dodatkowo, nie wyciągamy żadnych niepotrzebnych danych.

Wiadomo, te rozwiązanie ma swoje minusy (między innymi sztywność i potrzeba niskopoziomowej implementacji), ale uzyskana wydajność jest wyśmienita i co najważniejsze, model domenowy jest chroniony. Cała warstwa biznesowa jest po prostu obchodzona szerokim łukiem.

Żeby nie być gołosłowny, dokładnie taka sama rozterka opisana jest tu:
http://cqrs.files.wordpress.com/2010/11/cqrs_documents... , strona 20-21
http://bottega.com.pl/pdf/materialy/ddd/ddd4b.pdf , strona 1
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: CQRS czyli co....

Marcin M.:
No to już chyba zrozumiałem główny problem:

Obiekty DTO dla query modelu są tworzone per widok/raport, nie per agregat.

DTO nie są bytami utrwalanymi więc ich temat CQRS bezpośrednio nie dotyczy, poza faktem, że mogą być są produktem np. wyszukiwania)

przypomnę moja metaforę CQRS:
1. ciężko agregat: kompletna kartoteka produktu
2. lekka encja synchronizowana (zapisana odrębnie): pozycja cennika (czyli tylko nazwa, cena)

1. i 2. to rozłączne pliki (tablice)

konto usunięte

Temat: CQRS czyli co....

Jakub, zastanów się co robi np. magazynier:
- ma kartoteki towarowe zawierające detaliczne dane o produktach (złożone agregaty)
- ma także "zeszycik" zawierający kluczowe dane: nazwa, cena, ilość

To jest CQRS: dodajesz dodatkowa tablicę (zeszycik) tylko po to by nie babrać się w opasłych kartotekach, bo bardzo wiele pytań do magazyniera to tylko pytania o to ile ma i po ile...
Z perspektywy modelu dziedziny, taki zeszycik może być widokiem zmaterializowanym, nie ma to znaczenia, bo "od góry" widać i pełne agregaty i uproszczona płaską tablice (widok) czy "dwa" zestawy danych o tym samym", tu jednak będzie problem, bo szybkie wyświetlenia cennika z magazynu czasem może taka strukturę zabić... zaś optymalizacja "prawdziwych agregatów" po protu je zniszczy i kolega moim zdaniem ma rację pisząc to co napisał...

Ok, to rozumiem. :)

Tylko co widoki (nawet zmaterializowane) mają wspólnego z tym:
http://www.udidahan.com/2009/12/09/clarified-cqrs/
albo tym
http://codebetter.com/gregyoung/2010/02/16/cqrs-task-b... ? :D

Inna sprawa, ze w sieci jest masa bełkotu o CQRS,

Greg Young przypisuje sobie autorstwo CQRS, więc jeśli ten bełkot dotyczy również jego to ... ;)
Łukasz Kwiatkowski

Łukasz Kwiatkowski Programista Java

Temat: CQRS czyli co....

Jakub W.:

Tylko co widoki (nawet zmaterializowane) mają wspólnego z tym:
http://www.udidahan.com/2009/12/09/clarified-cqrs/
albo tym
http://codebetter.com/gregyoung/2010/02/16/cqrs-task-b... ? :D

Inna sprawa, ze w sieci jest masa bełkotu o CQRS,

Greg Young przypisuje sobie autorstwo CQRS, więc jeśli ten bełkot dotyczy również jego to ... ;)

Jakubie czy Ty naprawdę nie rozumiesz samej idei CQRS?
Czytam Twoje wypowiedzi i widzę, że cały czas próbujesz znaleźć dziurę w całym, nie podając konkretnych argumentów.
Idea CQRS to separacja Command / Query. To wszystko, implementacja jest dowolna.

Przeglądnij source code przykładowego projektu:
https://code.google.com/p/ddd-cqrs-sample/

konto usunięte

Temat: CQRS czyli co....

Masz sobie agregat X, który odpowiada jakiejś ważnej rzeczy w biznesie. No i ten obiekt ma swoje ID, i jakieś pola stałe, ale też posiada kolekcję encji Y (jeden do wielu), z których każda ma przypisaną słownik dynamicznych atrybutów (po javowemu to będzie Map<String,String>). No i teraz masz widok, który ma dla każdego X, wziąć najnowszy Y i do tego umożliwić przeszukiwanie po atrybutach tego najnowszego Y.

Jeśli zrobisz to programując na agregatach, to będzie trup wydajnościowy i żadna technika ORMowa tu nie pomoże. Jak najnowszy klaster SSD przestanie pomagać to niestety możliwości takiego systemu się kończą.

... chyba rozmawiamy o dwóch różnych rzeczach.

Hm ... co "twoje" CQRS proponuje w takiej sytuacji ?
W "moim" tworzona jest (w wielkim skrócie) druga, zdenormalizowana baza danych która udostępnia dane widokom.
Ale mówisz o tym CQRS Grega Younga czy Udi Dahana ?

W gruncie rzeczy to jest jedno i to samo, tylko zrealizowane na innym poziomie. Podaj mi proszę różnice, na które tak zwróciłeś uwagę.

Jest w podesłanym artykule (autorstwa Grega Younga):
"Many people have been getting confused over what CQRS is. They look at CQRS as being an architecture; it is not. CQRS is a very simple pattern that enables many opportunities for architecture that may otherwise not exist. CQRS is not eventual consistency, it is not eventing, it is not messaging, it is not having separated models for reading and writing, nor is it using event sourcing. I want to take a few paragraphs to describe first exactly what CQRS is and then how it relates to other patterns."
W każdym bądź razie - nie będzie to ani wydajne, ani łatwe do napisania. O tym, że nie będzie w ogóle działać chyba pisać nie muszę.

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

No właśnie, przydało by się takie wyjaśnienie. Podałeś link do jednego z wielu opracowań CQRS i zupełnie nie mam pojęcia jak się on ma do Twojej wypowiedzi.

To jest oryginalne opracowanie.
Greg Young przypisuje sobie autorstwo CQRS.
:) CQRS nigdy - ale po programistach którzy stosują ten absurdalny wzorzec można spodziewać się wszystkiego.

Ups, znowu ocena rzeczy bazująca na ocenie osoby/osób.

Sprawa w "moim" CQRS wygląda tak - w związku z dużą ilością locków zakładanych przez dużą ilość transakcji wykonujących insert / update / delete, baza danych przestaje sobie radzić z obsługą SELECT (tzn. obsługa trwa długo).

Zdolny programista (projektant ?) radzi sobie w ten sposób, że zakłada odrębną (dedykowaną dla widoków) bazę danych ze zdenormalizowanym schematem i synchronizuje ją z bazą znormalizowaną. Elegancko - ale nie do końca: w związku z tym, że baza dla widoków jest aktualizowana po zmianie na bazie "dla logiki", może się zdarzyć, że baza dla "widoków" będzie udostępniać nieaktualne dane, czyli okazjonalnie zdarzą się "DIRTY_READ". Ale to podobno nie jest problemem.

Absurd polega na tym, że to samo można uzyskać bez dodatkowej bazy, poprzez "pozwolenie" SELECTom widokowym na DIRTY_READ.

Autorem "mojego" CQRS była osoba która nie znała mechanizmów LOCK w bazie danych.

Jak osoba która się "nie zna" może "minimalizować problemy" ?
Proszę tylko i wyłącznie o obronę twojego argumentu mówiącego, że CQRS powoduje wyciągnięcie logiki z domeny. Obchodzisz ten temat szerokim kołem, ale tak się nie da wiecznie :)

Gdzie coś takiego napisałem ? :)
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: CQRS czyli co....

Jakub W.:
Sprawa w "moim" CQRS wygląda tak - w związku z dużą ilością locków zakładanych przez dużą ilość transakcji wykonujących insert / update / delete, baza danych przestaje sobie radzić z obsługą SELECT (tzn. obsługa trwa długo).

Zdolny programista (projektant ?) radzi sobie w ten sposób, że zakłada odrębną (dedykowaną dla widoków) bazę danych ze zdenormalizowanym schematem i synchronizuje ją z bazą znormalizowaną. Elegancko - ale nie do końca: w związku z tym, że baza dla widoków jest aktualizowana po zmianie na bazie "dla logiki", może się zdarzyć, że baza dla "widoków" będzie udostępniać nieaktualne dane, czyli okazjonalnie zdarzą się "DIRTY_READ". Ale to podobno nie jest problemem.

OK, rozumiem.
Absurd polega na tym, że to samo można uzyskać bez dodatkowej bazy, poprzez "pozwolenie" SELECTom widokowym na DIRTY_READ.

ale widok "siedzi" na "full agregatach'.... czya nie?

autorstwo "tego pana" olewam bo idei sie nie chroni :)))
Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: CQRS czyli co....

Jakub W.:
... chyba rozmawiamy o dwóch różnych rzeczach.

Hm ... co "twoje" CQRS proponuje w takiej sytuacji ?
W "moim" tworzona jest (w wielkim skrócie) druga, zdenormalizowana baza danych która udostępnia dane widokom.

Szczerze "moje" CQRS zaproponuje to samo (jako końcowe i najpotężniejsze rozwiązanie), no ale żeby wyjaśnić twoje podejście całkowicie i znaleźć różnice między moim, poproszę o doprecyzowanie: przez jaki interface przejdzie zapytanie do tej zdenormalizowanej bazy i jakich obiektów użyje do realizacji zadania.
Proszę tylko i wyłącznie o obronę twojego argumentu mówiącego, że CQRS powoduje wyciągnięcie logiki z domeny. Obchodzisz ten temat szerokim kołem, ale tak się nie da wiecznie :)

Gdzie coś takiego napisałem ? :)

No masz rację, trochę nad interpretowałem twoją wypowiedź. Dokładniej powiedziałeś o tym, że CQRS (jako segregacja interfejsów) jest złym pomysłem, bo zmusza do umieszczania logiki widoku w serwisach. Moim zdaniem twoje rozwiązanie podanego przeze mnie problemu zrobi dokładnie to samo, co więcej te twoje rozwiązanie też "domaga się" segregacji interfejsów.

Następna dyskusja:

z klas bo bazy czyli jaki w...




Wyślij zaproszenie do