Ich verstehe, dass Befehle nichts zurückgeben sollten.
Das ist eine Ansicht, aber nicht ganz in Stein gemeißelt. Erwägen Sie Schreibvorgänge (PUT, POST, DELETE) in HTTP. Alle diese Nachrichten sind Befehle in dem Sinne, dass es sich um Nachrichten handelt, die den Status der Ressourcenänderung anfordern, und dennoch alle Antworten zurückgeben.
Wie gehen Sie mit Fehlern jenseits des Command Bus um? (Beispiel: Ein Benutzer hat sich 1 Sekunde zuvor mit demselben Benutzernamen / derselben E-Mail-Adresse registriert.)
Woher wissen Sie, dass dieser Befehl fehlgeschlagen ist, und woher wissen Sie, dass der Fehler aufgetreten ist?
In einem Fall, in dem Sie direkt mit dem Befehlshandler kommunizieren, ist eine zurückgegebene Nachricht eine sehr vernünftige Methode, um zu bestätigen, dass der Befehl empfangen und verarbeitet wurde.
Wenn Sie eine Middleware wie einen Bus verwenden, die Sie daran hindert, direkt mit dem Ziel zu kommunizieren, sollten Sie asynchrone Messaging-Muster verwenden Anrufer?
Eine Idee ist, das Ergebnis des Befehls zu abonnieren. Dies basiert auf einigen Ideen in Hohpes Enterprise Integration Patterns. Die Grundidee ist, dass der Client, da er mit der gesendeten Befehlsnachricht vertraut ist, gut positioniert ist, um alle neuen Nachrichten zu abonnieren, die als Folge der Befehlsnachricht veröffentlicht wurden. Nachdem die Daten im Protokoll gespeichert wurden, veröffentlicht der Befehlshandler Ereignisse, die den Erfolg der Änderung anzeigen, und der Client abonniert diese Ereignisse. Er erkennt die richtigen Ereignisse, indem er die Übereinstimmung verschiedener Kennungen in der Nachricht berücksichtigt (Ursachen-ID, Korrelations-ID usw.).
Alternative Ansätze sind etwas direkter. Eine Möglichkeit wäre, einen Rückruf in die Nachricht aufzunehmen, der vom Befehlshandler aufgerufen werden kann, nachdem die Nachricht erfolgreich verarbeitet wurde.
Eine sehr ähnliche Alternative besteht darin, Platz in der Befehlsnachricht für den Befehlshandler zu reservieren, um die Bestätigung zu schreiben - da der Client die fragliche Befehlsnachricht bereits hat, ist die Schaltung bereits abgeschlossen. Denken Sie an " Versprechen " oder " abschließbare Zukunft". Die Nachricht teilt dem Befehlshandler mit, wo die Bestätigung geschrieben werden soll. dies signalisiert dem Client (Countdown-Latch), dass die Bestätigung verfügbar ist.
Und natürlich haben Sie die zusätzliche Möglichkeit, die Middleware zu entfernen, die Sie scheinbar daran hindert, einfach das Richtige zu tun.
Beispielsweise hat sich ein Benutzer 1 Sekunde zuvor mit demselben Benutzernamen / derselben E-Mail-Adresse registriert
Wenn Sie die Benutzerregistrierung idempotent handhaben, ist dies nicht unbedingt ein Fehler. Das Wiederholen von Nachrichten, bis eine Antwort beobachtet wird, ist eine übliche Methode, um mindestens eine Zustellung sicherzustellen.