Ich bin auf Event Sourcing Design gestoßen und möchte es in einer Anwendung verwenden, in der ein REST-Client benötigt wird (RESTful, um genau zu sein). Ich kann diese jedoch nicht miteinander verbinden, da REST ziemlich CRUD-artig ist und das Beschaffen von Ereignissen aufgabenbasiert ist. Ich habe mich gefragt, wie Sie die Erstellung von Befehlen basierend auf Anforderungen an den REST-Server gestalten können. Betrachten Sie dieses Beispiel:
Mit REST können Sie der Ressource Datei einen neuen Status zuweisen. In einer Anfrage können Sie einen neuen Dateinamen senden, den übergeordneten Ordner und / oder den Eigentümer der Datei ändern und so weiter.
Wie baue ich den Server auf, damit ich Event-Sourcing verwenden kann? Ich habe über diese Möglichkeiten nachgedacht:
Bestimmen Sie auf dem Server , welche Felder geändert wurden , und erstellen Sie entsprechende Befehle (
RenameFileCommand
,MoveFileCommand
,ChangeOwnerCommand
, ...) und den Versand individuell diese. In dieser Konfiguration kann es jedoch vorkommen, dass jeder Befehl fehlschlägt und andere nicht mehr zur Transaktion und damit nicht mehr zu einer "atomaren" Änderung der Ressource führen.Versand nur ein Befehl (
UpdateFileCommand
) und in den Befehlshandler, genauer gesagt im Aggregate, festzustellen , welche Felder geändert wurden und einzelne Ereignisse senden statt (FileRenamedEvent
,FileMovedEvent
,OwnerChangedEvent
, ...)Dieses hier mag ich überhaupt nicht: In der Anfrage an den Server würde ich in den Headern angeben, welcher Befehl verwendet werden soll, da die Benutzeroberfläche immer noch aufgabenbasiert ist (aber die Kommunikation erfolgt über REST). Bei jeder anderen Verwendung der REST-Kommunikation (z. B. in externen Apps) schlägt dies jedoch fehl, da diese nicht verpflichtet sind, nur das eine Feld in einer Anforderung zu ändern. Außerdem bringe ich eine ziemlich große Kopplung in das UI-, REST- und ES-basierte Backend.
Welches würden Sie bevorzugen oder gibt es eine bessere Möglichkeit, damit umzugehen?
Randnotiz: App in Java und Axon Framework für Event-Sourcing geschrieben.