Was mir nicht klar ist, warum Sie Ihre Aggregate jemals aus dem Event Store selbst rehydrieren würden.
Weil die "Ereignisse" das Buch der Aufzeichnungen sind.
Wenn das Projizieren von Änderungen an "Lese" -Datenbanken so einfach ist, warum nicht immer Änderungen an einer "Schreib" -Datenbank projizieren, deren Schema perfekt zu Ihrem Domänenmodell passt? Dies wäre effektiv eine Snapshot-Datenbank.
Ja; Manchmal ist es eine nützliche Leistungsoptimierung, eine zwischengespeicherte Kopie des Aggregatzustands zu verwenden, anstatt diesen Zustand jedes Mal von Grund auf neu zu generieren. Denken Sie daran: Die erste Regel zur Leistungsoptimierung lautet "Don't". Die Lösung wird dadurch komplexer, und Sie möchten dies lieber vermeiden, bis Sie eine überzeugende Geschäftsmotivation haben.
Wenn dies der Fall ist, ist der Ereignisspeicher nur dann nützlich, wenn Sie Ihre "Write" -Datenbank aufgrund von Schemaänderungen neu erstellen? Oder vermisse ich etwas Größeres?
Ihnen fehlt etwas Größeres.
Der erste Punkt ist, dass Sie, wenn Sie sich für eine ereignisbasierte Lösung entscheiden, erwarten, dass die Historie des Geschehens erhalten bleibt, dh, Sie möchten zerstörungsfreie Änderungen vornehmen .
Deshalb schreiben wir überhaupt an den Event Store.
Dies bedeutet insbesondere, dass jede Änderung in den Ereignisspeicher geschrieben werden muss.
Konkurrierende Autoren können möglicherweise die Schreibvorgänge des jeweils anderen zerstören oder das System in einen unbeabsichtigten Zustand versetzen, wenn sie sich der Änderungen des anderen nicht bewusst sind. Der übliche Ansatz, wenn Sie Konsistenz benötigen, besteht darin, Ihre Schreibvorgänge an eine bestimmte Position im Journal zu richten (analog zu einem bedingten PUT in einer HTTP-API). Ein fehlgeschlagener Schreibvorgang weist den Schreiber darauf hin, dass sein derzeitiges Verständnis des Journals nicht synchron ist und dass er sich erholen sollte.
Die Rückkehr zu einer bekannten guten Position und die Wiederholung weiterer Ereignisse seit diesem Zeitpunkt ist eine gängige Wiederherstellungsstrategie. Diese bekannte gute Position kann eine Kopie des lokalen Caches oder eine Darstellung in Ihrem Snapshot-Speicher sein.
Auf dem glücklichen Pfad können Sie eine Momentaufnahme des Aggregats im Speicher behalten. Sie müssen sich nur an ein externes Geschäft wenden, wenn keine lokale Kopie verfügbar ist.
Darüber hinaus müssen Sie nicht vollständig eingeholt werden, wenn Sie Zugriff auf das Geschäftsbuch haben.
Daher besteht der übliche Ansatz ( bei Verwendung eines Snapshot-Repositorys) darin, es asynchron zu verwalten . Auf diese Weise können Sie eine Wiederherstellung durchführen, ohne den gesamten Verlauf des Aggregats erneut zu laden und abzuspielen.
In vielen Fällen ist diese Komplexität nicht von Interesse, da feinkörnige Aggregate mit begrenzter Lebensdauer normalerweise nicht genügend Ereignisse erfassen, um die Kosten für die Verwaltung eines Snapshot-Caches zu übersteigen.
Wenn es sich jedoch um das richtige Tool für das Problem handelt, ist es durchaus sinnvoll, eine veraltete Darstellung des Aggregats in das Schreibmodell zu laden und es anschließend mit zusätzlichen Ereignissen zu aktualisieren.