Event Sourcing
Einleitung
Event Sourcing speichert nicht den aktuellen Zustand eines Systems –
sondern jede Zustandsänderung als Ereignis.
Der aktuelle Zustand wird aus der Event-Historie rekonstruiert.
Das bedeutet:
Der Event-Stream ist die Quelle der Wahrheit.
Der State ist nur eine Ableitung.
Einordnung
Event Sourcing ist ein Persistenz-Pattern auf Applikationsebene.
Es beschreibt:
- wie Zustand gespeichert wird
- wie Aggregate rekonstruiert werden
- wie Historie modelliert wird
Es ist:
- kein Messaging-Pattern
- kein Integrations-Pattern
- kein Microservices-Pattern
Es wird häufig mit CQRS kombiniert, ist aber unabhängig davon.
Grundprinzip
Kernaussage:
- Events sind dauerhaft
- State ist rekonstruierbar
- Projections sind abgeleitet
Zielsetzung
Event Sourcing adressiert:
- vollständige Auditierbarkeit
- Reproduzierbarkeit von Abläufen
- zeitliche Queries („State zu Zeitpunkt X“)
- flexible, spätere Read-Modelle
Nicht:
- reine Performance-Optimierung
- CRUD-Vereinfachung
Zentrale Konzepte
1️⃣ Aggregate als Konsistenzgrenze
Ein Aggregate:
- verarbeitet Commands
- validiert Invarianten
- erzeugt Events
Die Events repräsentieren:
fachliche Tatsachen, nicht technische Updates.
2️⃣ Append-Only Event Store
- Events werden niemals verändert
- Nur neue Events werden hinzugefügt
- Historie bleibt unverändert
Das macht das System:
- nachvollziehbar
- aber auch unveränderlich
3️⃣ Snapshots
Bei langen Event-Streams:
- Rekonstruktion wird teuer
- Snapshots speichern Zwischenzustände
- Events nach Snapshot werden re-applied
Snapshots sind Performance-Optimierung – keine Quelle der Wahrheit.
4️⃣ Versionierung
Events sind Teil des öffentlichen Vertrags.
Änderungen erfordern:
- Versionierung
- Upcaster
- Migration-Strategien
Event-Schema-Design ist kritisch.
Vorteile
- Vollständiger Audit-Trail
- Zeitliche Abfragen möglich
- Replaying zur Fehleranalyse
- Flexible Projektionen
- Debugging durch Rekonstruktion
Risiken / typische Fallstricke
1️⃣ Hohe Modellierungsanforderungen
Event Sourcing funktioniert nur gut, wenn:
- Aggregate sauber geschnitten sind
- Invarianten klar definiert sind
- Events fachlich präzise sind
2️⃣ Event-Schema-Drift
Schlecht versionierte Events führen zu:
- Rebuild-Problemen
- Kompatibilitätschaos
3️⃣ Komplexität
Event Sourcing erhöht:
- Entwicklungsaufwand
- Testing-Aufwand
- Betriebsaufwand
4️⃣ Falsche Motivation
„Weil es modern ist“ „Weil wir Kafka haben“ „Weil wir CQRS machen“
Das sind keine validen Gründe.
Event Sourcing ≠ Event-Driven Architecture
Event Sourcing:
- speichert interne Zustandsänderungen
EDA:
- integriert Systeme über Events
Beide können kombiniert werden – sind aber unterschiedliche Konzepte.
Wann sinnvoll?
- Hohe regulatorische Anforderungen
- Finanzsysteme
- Vertrags- oder Ledger-Systeme
- Stark zeitabhängige Domänen
- Hoher Bedarf an Audit und Replay
Wann Overkill?
- CRUD-dominiert
- Kleine Teams
- Einfache Geschäftslogik
- Keine Audit-Anforderungen
Varianten
🟢 Event Sourcing + CQRS
Typische Kombination, aber nicht zwingend.
🟡 Event Sourcing ohne getrennte Read-DB
Einfachere Variante.
🔴 Event Sourcing + Microservices
Hohe Komplexität, nur bei Reife sinnvoll.
Strategische Perspektive
Event Sourcing verschiebt Komplexität:
Von:
- komplizierten Migrationen
- fehlender Historie
Zu:
- Event-Design
- Versionierung
- Rebuild-Strategien
Es ist ein mächtiges Werkzeug – aber nur für reife Domänen.
Fazit
Event Sourcing speichert Geschichte statt Zustand.
Es ist sinnvoll, wenn:
- Historie ein Kernbestandteil der Domäne ist
- Audit nicht optional ist
- langfristige Evolvierbarkeit entscheidend ist
Es ist kein Architektur-Statussymbol. Es ist ein bewusstes Persistenzmodell.