Es wird gesagt, dass es in CQRS einfach ist, einen Fehler zu beheben. Sie müssen die Ereignisse nur erneut bereitstellen und dann wiedergeben.
Was ist jedoch, wenn eines der Ereignisse dazu führen sollte, dass ein externes System, das nicht unter Ihrer Kontrolle steht, einen Artikel an den Kunden versendet, wenn Sie nur die Ereignisse wiederholen, bei denen der Artikel zweimal versendet wird?
Wie lösen Sie das?
Aus Martin Fowlers Event-Sourcing- Artikel:
Wenn Sie also den Status Ihres Systems zu einem bestimmten Zeitpunkt wiederherstellen müssen, spielen Sie den gespeicherten Status und nicht die Ereignishandler bis zu diesem Moment erneut ab.
Wenn Sie jedoch nur mit Statusdaten arbeiten, sollte dies keine Auswirkungen auf das externe System haben. Es sei denn, Sie haben Trigger oder Beobachter in Ihrem Ereignisspeicher. In diesem Fall sollten Sie diese für die Dauer der Wiederherstellung deaktivieren. Da Sie sagen, dass Sie keine Kontrolle über das externe System haben, sollten Sie nicht versuchen, seinen Status mithilfe der exponierten API wiederherzustellen, da Sie nicht wissen, welche Nebenwirkungen es in ihrem System haben kann. Wenn die Wiederherstellung das System in einen Zwischenzustand versetzt (z. B. aufgrund fehlgeschlagener Vorgänge im externen System), sollte dies nicht in die Zuständigkeit einer Ereigniswiedergabe fallen.
quelle
Um ein bestimmtes Beispiel auszuwählen, betrachten wir, wie ein "mindestens einmaliger" Ansatz für Nebenwirkungen funktionieren könnte.
Das Domänenmodell verfolgt also, was zu tun ist. überlässt aber das eigentliche Tun der Anwendung
Im Zusammenhang mit der Ausführung eines Befehls sieht die Grundidee gleich aus. Die tatsächlichen Nebenwirkungen treten außerhalb der Transaktion auf, die das Modell aktualisiert.
Die Unit-Tests für Ihr Modell könnten also ungefähr so aussehen
Die Hauptpunkte hier sind
quelle