Ich entwerfe ein System, das Event Sourcing, CQRS und Microservices verwendet. Ich muss verstehen, dass dies kein ungewöhnliches Muster ist. Ein Schlüsselmerkmal des Dienstes muss die Fähigkeit sein, aus einem Aufzeichnungssystem zu rehydrieren / wiederherzustellen. Microservices erzeugen Befehle und Abfragen auf einem MQ (Kafka). Andere Microservices reagieren (Ereignisse). Befehle und Abfragen werden in S3 zum Zweck der Überwachung und Wiederherstellung beibehalten.
Der aktuelle Denkprozess war, dass wir zum Wiederherstellen des Systems das Ereignisprotokoll aus S3 extrahieren und es einfach an Kafka zurückmelden konnten.
Dies berücksichtigt jedoch nicht die Veränderungen sowohl bei den Herstellern als auch bei den Verbrauchern im Laufe der Zeit. Die Versionierung auf Befehls- / Abfrageebene scheint einen Beitrag zur Lösung des Problems zu leisten, aber ich kann mich nicht mit der Versionierung von Verbrauchern befassen, sodass ich erzwingen kann, dass ein Befehl, der während einer Wiederherstellung empfangen und verarbeitet wird, genau derselbe ist [Version des] Codes, der die Verarbeitung ausführt, da der Befehl zum ersten Mal empfangen wurde.
Gibt es Muster, mit denen ich das lösen kann? Kennt jemand andere Systeme, die für diese Funktion werben?
BEARBEITEN: Ein Beispiel hinzufügen.
Ein "Käufer" sendet eine "Frage" an einen "Verkäufer" auf meiner Auktionsseite. Der Fluss sieht wie folgt aus:
UI -> Web App: POST /question {:text text :to seller-id :from user-id}
Web App -> MQ: SEND {:command send-question :args [text seller-id user-id]}
MQ -< Audit: <command + args appended to log in S3>
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
Aufgrund einer neuen Geschäftsanforderung passe ich jetzt den Verbraucher "Fragendienst" an, um die Anzahl aller ungelesenen Fragen beizubehalten. Das DB-Schema wird geändert. Bisher hatten wir keine Ahnung, ob der Verkäufer eine Frage gelesen hat oder nicht. Die letzte Zeile wird:
MQ -< Questions service: - Record question in DB
- Email seller 'You have a question'
- Increment 'unread questions count'
Zwei Befehle sind Probleme, einer vor der Änderung und einer nach der Änderung. Die Anzahl der ungelesenen Fragen entspricht 1.
Das System stürzt ab. Wir haben wiederhergestellt, indem wir die Befehle über den neuen Code wiedergegeben haben. Am Ende der Wiederherstellung beträgt die Anzahl unserer "ungelesenen Fragen" 2. Auch wenn das Ergebnis in diesem erfundenen Beispiel keine Katastrophe ist, ist der wiederhergestellte Zustand nicht der vorherige.