Von der Theorie zur Praxis des Event Sourcing: Implementierung eines Remote-Config-Service mit NestJS
(borntodare.me)Einleitung
Der Vortrag von Ji-hyeok Won über Event Sourcing beim Karrot Server Meetup hat mir sehr dabei geholfen, Event Sourcing zu verstehen. Ich habe die grundlegenden Konzepte von Event Sourcing zusammengefasst und auf Basis des Vortrags einen einfachen Config-Service auf Grundlage von NestJS, TypeScript und MongoDB erstellt.
- Original: Aufbau einer skalierbaren internen Plattform mit Event Sourcing | Karrot SERVER Meetup #2
- Beispiel-Quellcode für den Event-Sourcing-Config-Service
Grundkonzepte des Event Sourcing
- Im Unterschied zum klassischen CRUD-Ansatz werden alle Zustandsänderungen als unveränderliche Events aufgezeichnet, was Audit-Trails und Rollbacks erleichtert
- Wie in einem Buchhaltungsjournal werden alle Transaktionen (Events) der Reihe nach protokolliert, sodass sich der aktuelle Zustand jederzeit rekonstruieren lässt
Zentrale Bausteine
- Event
- Enthält eine eindeutige ID, Erstellungszeit, Event-Typ, Benutzerinformationen und den Inhalt (Body) und garantiert Unveränderlichkeit sowie Vollständigkeit in sich selbst
- State
- Der Endzustand, der durch das Abspielen aller Events berechnet wird (bei Bedarf mit Snapshots oder Caching)
- Reducer
- Eine pure Funktion, die den vorherigen Zustand und ein Event als Eingabe erhält, daraus einen neuen Zustand berechnet und dabei die Unveränderlichkeit wahrt
- Entity
- Verwaltet zusammengehörige Events als ein Objekt, sodass sich die Änderungshistorie einer bestimmten Entity effizient abfragen lässt
Implementierungsbeispiel und Struktur
- Grundlegendes Setup: Start der Anwendung mit NestJS
- Entity- und Event-Definitionen
- Mithilfe von TypeScript-Interfaces und MongoDB-Schemas werden verschiedene Events (z. B. Erstellen einer Konfiguration, Hinzufügen/Entfernen von Parametern) und Statusobjekte klar definiert
- Implementierung des Reducers:
- Es werden pure Funktionen geschrieben, die den Zustand je nach Event-Typ aktualisieren, um durch das Abspielen der Event-Sequenz den Endzustand zu berechnen
- API-Endpunkte und Service-Layer
- Implementierung einer REST API zum Erstellen und Abrufen von Configs sowie zum Hinzufügen und Entfernen von Parametern
- Mit dem Dispatch-Commit-Pattern werden nach dem Veröffentlichen eines Events die Zustandsberechnung und das Speichern des Events nacheinander verarbeitet
Weiterführende Optimierung und Integration externer Systeme
- Generische Interfaces
- Durch das Design eines wiederverwendbaren Event-Repositorys werden Code-Duplikate reduziert und Typsicherheit sichergestellt
- Event-Handler
- Integration mit externen Systemen wie Slack, um bei auftretenden Events zusätzliche Verarbeitung wie das Versenden von Benachrichtigungen auszuführen
- Strategien zur Performance-Optimierung
- Snapshots: Der Zustand zu einem bestimmten Zeitpunkt wird gespeichert, sodass danach nur noch spätere Events angewendet werden müssen und die Kosten des vollständigen Replay reduziert werden
- Caching: Mithilfe von In-Memory-Cache oder Redis werden häufig abgefragte Entity-Zustände schnell bereitgestellt
Fazit
- Event Sourcing ist eine leistungsfähige Architektur, die durch die klare Aufzeichnung aller Änderungshistorien Zuverlässigkeit und Wartbarkeit erhöht
- Es sollte schrittweise passend zur Domäne eingeführt werden; zugleich sollten Optimierungsstrategien wie Snapshots und Caching eingesetzt werden, um die Systemleistung sicherzustellen und die Lernkurve bei der Einführung sorgfältig zu berücksichtigen
1 Kommentare
Sehr gut! ^0^