Mir ist klar, dass die obige Frage wahrscheinlich ein paar Fragen aufwirft, aber lassen Sie mich versuchen zu erklären:
Ich versuche, mich auf ein paar verwandte Konzepte einzulassen, im Grunde das Saga-Muster ( http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf ) in Kombination mit Event-Sourcing (Ein DDD-Konzept) : http://en.wikipedia.org/wiki/Domain-driven_design )
Ein guter Beitrag, der alles zusammenfasst: https://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/
Ich komme gleich zu der Frage, aber ich denke, ich muss versuchen, zunächst zusammenzufassen, was ich davon verstehe (was möglicherweise falsch ist, korrigieren Sie dies bitte, wenn dies der Fall ist), da dies möglicherweise einen Einfluss darauf hat, warum ich es bin die Frage stellen, um mit zu beginnen:
- Das Saga-Muster ist eine Art Broker, der bei einer bestimmten Aktion (Endbenutzer, Automatisierter usw., im Wesentlichen alles, was Daten ändert) diese Aktion in Geschäftsaktivitäten aufteilt und jede dieser Aktivitäten als Nachrichten an einen Nachrichtenbus sendet, der Sendet es wiederum an die jeweiligen Aggregatwurzeln, um es zu pflegen.
- Diese aggregierten Wurzeln können völlig autonom arbeiten (nette Trennung von Bedenken, große Skalierbarkeit usw.)
- Eine Saga-Instanz selbst enthält keine Geschäftslogik, die in den aggregierten Wurzeln enthalten ist, an die sie Aktivitäten sendet. Die einzige 'Logik', die in der Saga enthalten ist, ist die 'Prozess'-Logik (oft als Statemachine implementiert), die basierend auf empfangenen Aktionen (sowie Folgeereignissen) festlegt, was zu tun ist (dh welche Aktivitäten gesendet werden sollen).
- Das Saga-Muster implementiert eine Art verteiltes Transaktionsmuster. Dh, wenn eine der aggregierten Wurzeln (die wiederum autonom arbeiten, ohne die Existenz der anderen zu kennen) ausfällt, muss möglicherweise die gesamte Aktion zurückgesetzt werden.
- Dies wird umgesetzt, indem alle aggregierten Wurzeln nach Abschluss ihres Aktivitätsberichts an die Saga zurückgeschickt werden. (Im Erfolgsfall ebenso wie im Fehlerfall)
- Für den Fall, dass alle aggregierten Wurzeln erfolgreich sind, bestimmt die interne Statemachine, ob die Saga als Nächstes etwas unternimmt (oder entscheidet, ob dies getan wird).
- Im Fehlerfall gibt die Saga an alle Aggregatwurzeln, die an der letzten Aktion teilgenommen haben, eine sogenannte Ausgleichsaktion aus, dh: eine Aktion, um die letzte Aktion rückgängig zu machen, die jede der Aggregatwurzeln ausgeführt hat.
- Wenn die Aktion "plus 1 Stimme" war, könnte dies einfach eine "Minus 1 Stimme" sein, aber es könnte komplizierter sein, als wenn ein Blogpost auf seine vorherige Version zurückgesetzt würde.
- Event-Sourcing (siehe den Blogpost, in dem beide kombiniert werden) zielt darauf ab, die Ergebnisse der einzelnen Aktivitäten, die jeder der zusammengefassten Roots durchführt, in einem zentralen Event-Speicher zu speichern (die Änderungen werden in diesem Kontext als "Ereignisse" bezeichnet).
- Dieser Ereignisspeicher ist die "einzelne Version der Wahrheit" und kann verwendet werden, um den Status aller Entitäten abzuspielen, indem einfach die gespeicherten Ereignisse wiederholt werden (im Wesentlichen wie ein Ereignisprotokoll).
- Die Kombination der beiden Möglichkeiten (dh das Auslagern der Änderungen mithilfe von Event-Sourcing durch aggregierte Roots, bevor sie an die Saga zurückgemeldet werden) bietet viele nette Möglichkeiten, von denen eine meine Frage betrifft ...
Ich hatte das Gefühl, ich musste das von meiner Schulter nehmen, da es eine Menge ist, die ich auf einmal begreifen kann. In Anbetracht dieses Kontexts / dieser Einstellung (bitte korrigieren, falls falsch)
Die Frage: Wenn ein aggregierter Stamm eine Kompensationsaktion erhält und dieser aggregierte Stamm seine Zustandsänderungen mithilfe von Ereignisquellen ausgelagert hat, wäre die Kompensationsaktion nicht in allen Situationen einfach eine Löschung des letzten Ereignisses im Ereignisspeicher Aggregate Root gegeben? (Vorausgesetzt, die Persist-Implementierung erlaubt das Löschen)
Das würde für mich viel Sinn machen (und wäre ein weiterer großer Vorteil dieser Kombination), aber wie gesagt, ich könnte diese Annahmen auf der Grundlage eines falschen / unvollständigen Verständnisses dieser Konzepte treffen.
Ich hoffe, das wurde nicht zu langatmig.
Vielen Dank.