Kiedy stosować wzorzec projektowy CQRS?

Mój zespół i ja dyskutowaliśmy o użyciu wzorca projektowego CQRS (Command Query Responsibility Segregation) i nadal staramy się ocenić zalety i wady jego używania. Według: http://martinfowler.com/bliki/CQRS.html

Nie widzieliśmy jeszcze wystarczająco dużo zastosowań CQR w terenie, aby być pewnym że rozumiemy jego wady i zalety

Więc jak myślicie, kiedy problem wymaga użycia CQRS?

Author: Eric, 2012-01-11

7 answers

CQRS nie jest wzorcem, który obejmuje całą aplikację.

Jest to koncepcja, która opiera się na Domain Driven Design (DDD). Ważnym strategicznym pojęciem DDD jest tzw. kontekst Ograniczony .

W typowej aplikacji istnieje wiele ograniczonych kontekstów, z których każdy może być zaimplementowany w sposób, w jaki ma to sens. Na przykład

  • Zarządzanie użytkownikami - > CRUD
  • Fakturowanie - > CRUD
  • zarządzanie polisami ubezpieczeniowymi (domena Podstawowa) - > CQRS
  • ...

To prawdopodobnie nie odpowiada na twoje pytanie, ale może dać trochę więcej wglądu w temat. Szczerze mówiąc, nie sądzę, aby można było na to odpowiedzieć bez uwzględnienia specyfiki projektu, a nawet wtedy rzadko zdarza się coś w rodzaju określonej najlepszej praktyki.

 46
Author: Dennis Traub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-19 16:13:13

Cóż krytycy CQRL mogą powiedzieć, że CQRS jest skomplikowany i to może być prawda.

Oczywiście jest to dodawanie narzutu na rozwój prostej aplikacji CRUD w stylu CQRS, więc rozważyłbym użycie CQRS tylko w następujących przypadkach:

  1. duży zespół - możesz łatwo podzielić zadania programistyczne między ludzi, jeśli wybrałeś architekturę CQRS. Twoi najlepsi ludzie mogą pracować nad logiką domeny, pozostawiając zwykłe rzeczy mniej wykwalifikowanym programistom.
  2. trudny biznes logika - CQRS zmusza do unikania mieszania logiki domeny i operacji infrastrukturalnych.
  3. skalowalność ma znaczenie - dzięki CQRS możesz osiągnąć doskonałą wydajność odczytu i zapisu, obsługę poleceń można skalować na wielu węzłach, a ponieważ zapytania są operacjami tylko do odczytu, można je zoptymalizować pod kątem szybkich operacji odczytu.
 23
Author: Mairbek Khadikov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-25 00:47:02

Gdy masz złożoną lub twardą domenę biznesową i:

  • z event sourcing; chcesz fajny sposób testowania logiki
  • z event sourcing; chcesz udowodnić swoje zachowania poprzez testowanie i rozumowanie
  • masz wielu klientów lub konsumentów swojej usługi domenowej (nie tylko jednego serwera www)

Lub masz użytkowników, którzy muszą działać na wspólnych danych:

  • i chcesz sformalizować koncepcje scalania danych twojej domeny
  • lub ty chcesz zastosować logikę do scalania zdarzeń

Lub masz wymagania dotyczące skalowalności:

  • stosujesz wzorzec jako wzorzec denormalizacji, który usuwa wąskie gardła
  • Chcesz skalować poziomo, a nie pionowo]}

Lub masz problemy z wydajnością (inna strona skalowalności):

  • np. musisz przenieść swoją architekturę do architektury opartej na zdarzeniach - CQRS jako wzorzec jest dobrym krokiem.

Albo masz zespół, który jest fizycznie disjunct:

  • np. część zespołu jest w innym kraju
  • Jeśli chcesz oddzielić modele odczytu od strony zapisu rzeczy (sagas, domain, CRUD), to trudno jest uzyskać komunikację twarzą w twarz, więc chcesz oddzielić modele odczytu od strony zapisu (sagas, domain, CRUD).]}

To nie CQRS jest zbyt skomplikowane, to komputery, które są.

 9
Author: Henrik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-20 15:20:15

Kiedy używać wzorca projektowego CQRS?

Wzorzec architektury CQRS może być używany, gdy trudno jest uzyskać z repozytoriów Zapytanie o wszystkie dane, które użytkownicy muszą wyświetlić. Jest to szczególnie ważne, gdy UX design tworzy widoki danych, które przecinają kilka typów agregatów i wystąpień. Im bardziej wyrafinowana jest Twoja domena, tym bardziej wydaje się to prawdą.

Gdy nie nadaje się do kompromisu w projektowaniu UX, użycie CQRS próbuje złagodzić problemy związane z innymi rozwiązaniami, np.:

  • wymaganie, aby klienci korzystali z wielu repozytoriów do pobierania wszystkich zagregowanych instancji; lub
  • projektowanie wyspecjalizowanych finderów na różnych repozytoriach w celu zebrania niepołączonych danych za pomocą jednego zapytania.

Podsumowując: używaj CQRS, gdy trudne do wyszukania dane z repozytoriów muszą być wyświetlane przez użytkowników, co zdarza się im bardziej wyrafinowana jest Twoja domena.

 6
Author: Frederik Krautwald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-30 10:09:07

Z mojego punktu widzenia dodaje dwie główne korzyści.(Wśród wielu innych)

  1. Ekstremalna zdolność skalowania
  2. bardzo przydatne, gdy chodzi o distibuted zespołów.
 4
Author: Glenn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-11 14:17:27

W realnym świecie scenario CQRS może być przydatny, gdy masz klienta front end / web service, który potrzebuje dużo danych z wielu domen i pobieranie tych danych z bazy danych zajmuje dużo czasu.

W takim przypadku można rozważyć utworzenie oddzielnego modelu odczytu, który będzie szybciej rozwijany i może mieć szybszy czas wykonania.

 1
Author: Marcin Szymczak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-06 09:25:13

Oto powody, dla których należy stosować CQR:

  1. skalowalność (odczyt przekracza zapis, więc wymagania skalowania dla każdego różnią się i można je lepiej zaadresować)
  2. elastyczność (oddzielne modele odczytu / zapisu)
  3. zmniejszona złożoność (przeniesienie złożoności do oddzielnych problemów)
  4. skoncentruj się na domenie / biznesie
  5. ułatwia projektowanie intuicyjnych interfejsów użytkownika opartych na zadaniach
 0
Author: Ravi Ganesan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-16 10:08:24