Czy CQRS nadaje sie do aplikacji innych niz crudy?

Czy CQRS nadaje sie do aplikacji innych niz crudy?
kalimata
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:131
0

Moze trochę przewrotny temat, ale chciałbym poznać troche CQRS i zrobić aplikacje do kalkulacji np zakupów w sklepie.
W bazie danych mam np produkty dosępne w sklepie.
Czy stosując CQRS da sie coś takiego zrobić? Bo we wszystkich kursach Commmandy i Query odnoszą się do zadań na bazie. Jak użyc tego w takim kalkulatorze? Aplikacja ma umożliwiać wybór produktu oraz określenie jego parametrów, dodanie tego do koszyka. W grę wchodzi też sprawdzenie przed dodaniem do koszyka czy podane parametry produktu są prawidłowe, albo gdy wybrany zostanie produkt X który musi być sprzedawany zawsze w zestawie z produktem Y, to do koszyka powinny trafić obydwa produkty. Jak tutaj zaprząc CQRS, co będzie Commandami i Query?

Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
8

Nie tylko się nadaje, ale wręcz czym bardziej skomplikowana aplikacja tym bardziej CQRS może się przydać. Wydaje mi się natomiast że próbujesz chwytać się złego narzędzia. Masz wymagania na procesy które są bardziej złożone niż operacje CRUD, w związku z czym zainteresuj się np. task-based UI. Tutaj również fajny filmik w temacie.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
kalimata
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:131
0

@Aventus: dzięki zapoznam sie z tymi materiałami. Tak te procesy sa bardziej zaawansowane niz zwykly crud bo np chcialbym zeby np jak uzytkownik sklada sobie zestaw komputerowy to zeby aplikacja tez zliczyla jak mocny potrzebny zasilacz i tylko takie dala do wyboru.

MU
  • Rejestracja:ponad 4 lata
  • Ostatnio:około godziny
  • Postów:102
0

tak a propos tematu
"CQRS" widzialem na poziomie serwisu, czyli serwis miał część (metody) C i Q
ale przy skalowaniu, dany serwis dalej ma część C i Q

czy ktos widział na żywo serwisy które są albo C albo Q, tak zeby skalować częśc albo C albo Q?

to mi się kojarzy z apką pogodową
jest milion pytających
a komendatnów jest paru 3 może 10, albo niech będzie jeden na kraj to koło 200

i teraz część serwisów jest Q - dla tych co pytają o pogodę i to jest 99,95% systemu
a 0,05 to serwisy C, gdzie komendanci wpisują dane

kalimata
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:131
0

@Aventus: mam sytuacje ze chce na podstawie wybranych podzespołów komputerowych dobrać zasilacz. Czy do serwera powinienem wysłać Commanda z listą podszespołów i na serwrze przeliczyc zapotrzebowanie na moc na podstawie tych podzespołów? Tylko jak wtedy zwrócić przeliczona moc i np zasilacze spełniajace to kryterium?

Chyba ze to zle rozumiem? Bo chce ta aplikacje zrobić jako webapi. Czy Commandy i Query powinienem wykorzystać do komunikacji api z baza a uzytkownikowi wystawiac jakies gotowe metody oczekujace na liste podzespołów w parametrze i zwracające liste zasilaczy?

edytowany 1x, ostatnio: kalimata
BC
  • Rejestracja:prawie 6 lat
  • Ostatnio:2 miesiące
  • Postów:214
1

Najprościej jak to możliwe:
Commandem będzie dodanie/usunięcie procesora do/z koszyka
Query to odpytanie np o listę zasilaczy czy o sam koszyk

Standardowo command nie zwraca nic w przypadku gdy request jest poprawny. Natomiast query zwraca obiekty.
Na język restowy:
GET to query
POST/PUT/DELETE/PATCH to command

Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
0

@mussel:

czy ktos widział na żywo serwisy które są albo C albo Q, tak zeby skalować częśc albo C albo Q?

Tak, pracowałem przy takim systemie. Serwis odpowiedzialny za Q służył zwracaniu zmaterializowanych widoków na potrzeby UI- wliczały się w to dosyć skomplikowane zapytania gdzie zwracało się widok danego stanu w konkretnym momencie w czasie. Nie wiem jak to dokładniej wytłumaczyć, ale kiedy np. wyświetlało się A, to dodatkowo wyświetlało się podzbiór informacji B, natomiast kiedy wyświetlało się B, to UI również wyświetlał podzbiór informacji A i B, w dodatku na podstawie obecnie wyświetlanej informacji pewne operacje były zablokowane lub też nie.

Widok ten był zagregowany, a więc był rezultatem działań w różnych serwisach. Co za tym idzie kiedy użytkownik klikał jakiś przycisk aby dokonać zmian, command był wysyłany do jednego z tych serwisów.

@kalimata boska_cebula dobrze prawi, chociaż od tego też są wyjątki. Bywają przypadki gdzie np. query musi być wysłane POSTem. I jeśli RESTowi puryści próbują po przeczytaniu tego podnieść wrzawę to sprawa jest prosta- bezpieczeństwo przede wszystkim. Czasem pewnych zapytań zwyczajnie nie można wysyłać przez URL, szczególnie w dobie RODO. Ogólnie w Twoim przypadku rozwiązań można znaleźć kilka- pierwsze co mi przychodzi na myśl to że można wysłać wybrane podzespoły jako commands, natomiast po wysłaniu tego klient oddzielnie może wysłać zapytanie o wymaganą moc zasilacza- wtedy logika obsługująca query może obliczyć wszystko w locie, zakładając że nie jest to zbyt skomplikowana i długotrwała operacja.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
kalimata
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:131
0
  1. Czyli Query tu nie jest tylko odpytywaniem bazy i może w nim być każda dowolna logika? Tak wiec moge sobie jako parametr przekazywany z query podać liste elementow i w logice query przeliczyc jakie zasilacze sa potrzebne i je zwrocic tym samym query?

  2. Jeszcze się zastanawiam na sytuacja ze mam webapi i z baza przeprowadzam operacje za pomoca CQRS. A co w przypadku gdy mam jakąś operacje do któej nie potrzebuje bazy, tylko np tak dal uproszeczenia załóżmy ze jest sytuacja ze user podaje liczbe i ja chce sprawdzic czy jest ona parzysta i zwrócić true jeśli parzysta i false jeśli nieparzysta. Czy to jest Query z parametrem w postaci liczby podanej przez użytkownika?

edytowany 1x, ostatnio: kalimata
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
0

@kalimata:

Czyli Query tu nie jest tylko odpytywaniem bazy i może w nim być każda dowolna logika?

Nie do końca. Logika obsługująca zwracany wynik? Tak. Logika modyfikucjąca stan aplikacji? Nie.

Tak wiec moge sobie jako parametr przekazywany z query podać liste elementow i w logice query przeliczyc jakie zasilacze sa potrzebne i je zwrocic tym samym query?

Tak, chociaż ja bym zrobił to prościej. W query podał bym ID koszyka.

  1. Jeszcze się zastanawiam na sytuacja ze mam webapi i z baza przeprowadzam operacje za pomoca CQRS. A co w przypadku gdy mam jakąś operacje do któej nie potrzebuje bazy, tylko np tak dal uproszeczenia załóżmy ze jest sytuacja ze user podaje liczbe i ja chce sprawdzic czy jest ona parzysta i zwrócić true jeśli parzysta i false jeśli nieparzysta. Czy to jest Query z parametrem w postaci liczby podanej przez użytkownika?

To nie ma nic wspólnego z CQRS. W CQRS z samej tego natury mamy do czynienia z modyfikowaniem stanu aplikacji (command) i zwracaniem tego stanu (query).


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
kalimata
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:131
0
Aventus napisał(a):

To nie ma nic wspólnego z CQRS. W CQRS z samej tego natury mamy do czynienia z modyfikowaniem stanu aplikacji (command) i zwracaniem tego stanu (query).

Czyli to chodzi o mogdyfikowanie/zwracanie modelu, a jak chce sobie jakieś obliczenia zrobić to i tak robie to poza CQRS i ewentualnie wynik obliczen przekazuje do commanda/query?

Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
2

No nie. Po prostu Twoje query może przed zwróceniem modelu wykonać jakieś manipulacje na nim (np. obliczenie mocy procesora). Prawdpodobnie błędnie zakładasz że model który zwraca query musi być tym samym co model tworzony/aktualizowany przy wykonywaniu command. W rzeczywistości te modele mogą się różnić. Jak wcześniej wspomniałem model zwracany w query może być np. zagregowanym widokiem wynikającym z operacji w różnych częściach systemu.

W Twoim przypadku możesz np. wysłać query GetRequiredPowerSupplyPower przekazując ID koszyka. Logika obsługująca query załaduje podzespoły z koszyka (np. wyciągnie je z bazy danych) i obliczy wymagane zapotrzebowanie. Mode zwrócony z query do klienta może wtedy po prostu wyglądać tak:

Kopiuj
{
  "requiredPower": 550
}

W tym przypadku nie ma mowy o modifykowaniu jakiegoś instniejącego modelu- Ty tworzysz nowy model zwracany do klienta, ale jest to model widoku tworzony w locie. Nic nie jest zapisywane do bazy danych. Na podobnej zasadzie mógłbyś użyć view w SQL, a więc za pomocą SQL dokonywałbyś tego obliczenia. Wtedy Twój kod obsługujący query po prostu zwraca przygotowany widok ładując go z bazy.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
kalimata
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:131
0

@Aventus: dziękuję, teraz mi się bardziej rozjaśniło.
A mógłbyś mi jeszcze powiedzieć, czy jesli chce uzyc CQRS to muszę stosować też DDD i EventSourcing? Bo nie chce uzywac DDD i ES.

Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
3

Nie musisz. CQRS to coś całkowicie innego niż DDD jak i ES. Te wszystkie zagadnienia się dobrze uzupełniają ale żadne nie jest wymagane do tego aby używać drugiego.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)