Zasadniczo próbuję owinąć głowę koncepcją CQRS i powiązanymi koncepcjami.
Chociaż CQRS niekoniecznie obejmuje przesyłanie wiadomości i pozyskiwanie zdarzeń, wydaje się być dobrą kombinacją (co można zobaczyć w wielu przykładach / postach na blogu łączących te pojęcia)
Biorąc pod uwagę przypadek użycia dla zmiany stanu czegoś (powiedzmy, aby zaktualizować Pytanie na temat SO), czy uważasz, że następujący przepływ jest poprawny (jak w najlepszej praktyce)?
System wydaje zagregowaną komendę UpdateQuestionCommand, która może być podzielona na kilka mniejszych poleceń: UpdateQuestion, która jest skierowana na Root Aggregate Root, i UpdateUserAction (zliczanie punktów itp.) Na Root Aggregate użytkownika. Są one wysyłane asynchronicznie przy użyciu wiadomości typu punkt-punkt.
Zagregowane korzenie robią swoje, a jeśli wszystko pójdzie dobrze, odpalają odpowiednio odpowiednio EventUpdated i UserActionUpdated, które zawierają stan zlecony do sklepu z wydarzeniami. Aby zachować je w Yadayada, żeby być kompletnym, nie o to tutaj chodzi.
Te zdarzenia są również umieszczane w kolejce pub / sub do emisji. Każdy subskrybent (w tym prawdopodobnie jeden lub kilka Projektorów tworzących Widoki odczytu) może subskrybować te wydarzenia.
Ogólne pytanie: czy rzeczywiście najlepszą praktyką jest, aby polecenia były przekazywane punkt-punkt (tj .: odbiornik jest znany), podczas gdy zdarzenia są nadawane (tj. Odbiornik (odbiorcy) są nieznani)?
Zakładając powyższe, jaka byłaby zaleta / wada umożliwienia nadawania Komend za pośrednictwem pub / sub zamiast punkt-punkt?
Na przykład: Podczas nadawania poleceń podczas korzystania z Sagi może być problem, ponieważ rola mediacji, jaką Saga musi odgrywać w przypadku awarii jednego z zagregowanych korzeni, jest utrudniona, ponieważ saga nie wie, które zagregowane korzenie uczestniczą na początku .
Z drugiej strony widzę zalety (elastyczność), gdy wydawanie poleceń byłoby dozwolone.