Ich versuche im Grunde, mich mit dem Konzept von CQRS und verwandten Konzepten zu beschäftigen.
Obwohl CQRS Messaging und Event Sourcing nicht unbedingt beinhaltet, scheint es eine gute Kombination zu sein (wie aus vielen Beispielen / Blogposts hervorgeht, die diese Konzepte kombinieren).
Würden Sie angesichts eines Anwendungsfalls für eine Statusänderung für etwas (z. B. um eine Frage zu SO zu aktualisieren) den folgenden Ablauf als korrekt betrachten (wie in der Best Practice)?
Das System gibt einen aggregierten UpdateQuestionCommand aus, der möglicherweise in einige kleinere Befehle unterteilt ist: UpdateQuestion, das auf den Fragenaggregatstamm abzielt, und UpdateUserAction (zum Zählen von Punkten usw.), die auf den Benutzeraggregatstamm abzielen. Diese werden asynchron über Punkt-zu-Punkt-Nachrichten gesendet.
Die aggregierten Wurzeln machen ihr Ding und wenn alles gut geht, feuern sie die Ereignisse QuestionUpdated und UserActionUpdated ab, die einen Status enthalten, der an einen Event Store ausgelagert ist. Yadayada wird beibehalten, nur um vollständig zu sein, hier geht es nicht wirklich darum.
Diese Ereignisse werden auch zur Übertragung in eine Pub / Sub-Warteschlange gestellt. Jeder Abonnent (darunter wahrscheinlich ein oder mehrere Projektoren, die die Leseansichten erstellen) kann diese Ereignisse abonnieren.
Die allgemeine Frage: Ist es in der Tat eine bewährte Methode, dass Befehle Punkt zu Punkt übertragen werden (dh der Empfänger ist bekannt), während Ereignisse gesendet werden (dh die Empfänger sind unbekannt)?
Unter den oben genannten Umständen, was wäre der Vor- / Nachteil, wenn Befehle anstelle von Punkt zu Punkt über Pub / Sub gesendet werden könnten?
Beispiel: Beim Senden von Befehlen während der Verwendung von Saga kann dies ein Problem sein, da die Vermittlungsrolle, die eine Saga bei einem Ausfall einer der aggregierten Wurzeln spielen muss, behindert wird, da die Saga zunächst nicht weiß, an welchen aggregierten Wurzeln sie beteiligt ist .
Andererseits sehe ich Vorteile (Flexibilität), wenn Sendebefehle erlaubt wären.