In CQRS / ES wird ein Befehl vom Client an den Server gesendet und an den entsprechenden Befehlshandler weitergeleitet. Dieser Befehlshandler lädt ein Aggregat aus seinem Repository, ruft eine Methode dafür auf und speichert es zurück im Repository. Ereignisse werden generiert. Ein Ereignishandler / Saga / Prozessmanager kann diese Ereignisse abhören, um Befehle auszugeben.
Befehle (Eingabe) erzeugen also Ereignisse (Ausgabe), die dann weitere Befehle (Eingabe) in das System zurückspeisen können. Ist es nun üblich, dass ein Befehl keine Ereignisse ausgibt, sondern einen anderen Befehl in die Warteschlange stellt? Ein solcher Ansatz könnte verwendet werden, um die Ausführung in einem externen Prozess zu erzwingen.
BEARBEITEN:
Der spezifische Anwendungsfall, an den ich denke, ist die Verarbeitung von Zahlungsdetails. Der Client sendet einen PayInvoice
Befehl, dessen Nutzdaten die Kreditkartendaten des Benutzers enthalten. Der PayInvoiceHandler
übergibt einen MakeInvoicePayment
Befehl an einen separaten Prozess, der für die Interaktion mit der Payment - Gateway verantwortlich ist. Wenn die Zahlung erfolgreich ist, wird ein InvoicePaid
Ereignis generiert. Wenn das System aus irgendeinem Grund abstürzt, nachdem der PayInvoice
Befehl beibehalten wurde, aber bevor der MakeInvoicePayment
Befehl beibehalten wurde, können wir dies manuell verfolgen (es wurde keine Zahlung ausgeführt). Wenn das System abstürzt, nachdem der MakeInvoicePayment
Befehl beibehalten wurde, aber vor demInvoicePaid
Wenn das Ereignis weiterhin besteht, kann es vorkommen, dass die Kreditkarte des Benutzers belastet wird, die Rechnung jedoch nicht als bezahlt gekennzeichnet wird. In diesem Fall müsste die Situation manuell untersucht und die Rechnung manuell als bezahlt markiert werden.
Sie erhalten ein System, das architektonisch lockerer gekoppelt ist, wenn Sie nur Ereignisse von einem Befehl ausgeben. Anders ausgedrückt, ein Befehl sollte nicht wissen müssen, welche anderen externen Befehle ausgegeben werden sollen. Dies sollte in der Verantwortung der externen Partei liegen (die die Veranstaltung abonnieren sollte und, wie Sie bereits erwähnt haben, ein Saga-Manager mit Koordinierungsverantwortung oder nur ein anderes Modul sein könnte, das von diesen Veranstaltungen abhängig ist).
quelle
Empfohlene Anzeige: Udi Dahan über zuverlässiges Messaging - es ist nicht ganz das, was Sie beschreiben, aber eng verwandt.
Ich habe niemanden gesehen, der diese Praxis empfohlen hat.
Kurze Antwort: Wenn Sie einen Status nicht speichern, können Sie den Befehl in der Warteschlange nicht wiederherstellen, wenn Sie abstürzen, nachdem Sie bestätigt haben, dass Sie ihn erhalten haben.
Wenn Sie entscheiden, dass Sie den Status speichern müssen, ist es nicht klar, dass es einen großen Vorteil hat, den zweiten Befehl vom ersten zu planen, anstatt einen Ereignishandler zu verwenden.
quelle