Datenkonsistenz – Saga, Outbox, Idempotenz
Ausgangslage
In einer Microservice-Architektur existieren keine verteilten ACID-Transaktionen über mehrere Services.
Klassische 2-Phase-Commit-Ansätze sind:
- teuer
- fragil
- schwer skalierbar
- operativ riskant
Stattdessen gilt:
Jeder Service besitzt lokale Transaktionen.
Konsistenz entsteht durch Event-Koordination.
Das führt zu Eventual Consistency statt sofortiger globaler Konsistenz.
Kernmuster
1️⃣ Saga – Fachliche Prozesskoordination
Eine Saga beschreibt einen verteilten Geschäftsprozess, der aus mehreren lokalen Transaktionen besteht.
Es gibt zwei Varianten:
Saga – Orchestration
Ein zentraler Orchestrator steuert den Ablauf.
Eigenschaften:
- klare Ablaufsteuerung
- gute Übersicht
- zentrale Logik
Risiko: Orchestrator wird zu einem „Mini-Monolith“.
Saga – Choreography
Services reagieren auf Events ohne zentrale Steuerung.
Eigenschaften:
- hohe Dezentralität
- weniger zentrale Abhängigkeit
Risiko: Prozessfluss wird schwer nachvollziehbar („Event-Spaghetti“).
2️⃣ Outbox Pattern – Robuste Event-Publikation
Problem:
Wenn DB-Commit erfolgreich ist, aber Event-Publish fehlschlägt → Inkonsistenz.
Lösung:
Event wird in derselben lokalen Transaktion gespeichert.
Kernaussage:
- State + Event werden atomar gespeichert
- Event wird asynchron publiziert
- Kein Verlust bei Crash zwischen DB und Broker
Outbox ist ein Infrastrukturmuster, kein Fachmuster.
3️⃣ Idempotenz – Schutz gegen Duplikate
In verteilten Systemen gilt:
Messages können mehrfach zugestellt werden.
Consumer müssen deshalb:
- Event-ID speichern
- Verarbeitung erkennen
- Mehrfachverarbeitung vermeiden
Typische Strategien:
- Idempotency-Key
- Deduplication-Table
- UPSERT statt INSERT
- State-basierte Verarbeitung
Ohne Idempotenz sind Retry-Strategien gefährlich.
Zusammenspiel der Muster
In reifen Systemen werden die Muster kombiniert:
- Saga koordiniert fachliche Prozesse
- Outbox sichert Event-Zuverlässigkeit
- Idempotenz schützt vor Duplikaten
Erst das Zusammenspiel ergibt robuste Event-Konsistenz.
Mindestregeln für produktive Systeme
- Events haben stabile IDs.
- Events sind versioniert.
- Consumer sind idempotent.
- Retry mit Backoff ist definiert.
- Dead Letter Queue ist vorhanden.
- Events sind nachvollziehbar (Tracing / Correlation ID).
- Kompensationslogik ist explizit definiert (Saga).
Typische Fehler
- Event wird direkt nach DB-Commit publiziert (ohne Outbox)
- Keine Event-Versionierung
- Consumer vertrauen auf „exactly once“
- Kompensation wird vergessen
- Geschäftslogik wird implizit in Event-Handlern versteckt
Architekturelle Realität
Eventual Consistency ist kein Kompromiss – sie ist die Konsequenz verteilter Autonomie.
Microservices ohne Saga/Outbox/Idempotenz sind:
- operativ fragil
- schwer testbar
- riskant bei Last und Fehlern
Robuste Datenkonsistenz ist kein Detail, sondern ein Architektur-Kernmerkmal.