Transactional Outbox
Einleitung
Transactional Outbox löst das Atomaritätsproblem zwischen:
- Datenbank-Commit
- Event-Publikation
ohne verteilte Transaktionen (2PC).
Die Fachänderung und der Outbox-Eintrag passieren in derselben lokalen Transaktion.
Ein separater Relayer veröffentlicht die Events anschließend zuverlässig.
Ziel:
Keine verlorenen Events – trotz verteilter Systeme.
Einordnung
Transactional Outbox ist ein Zuverlässigkeits-Pattern für asynchrone Integration.
Es ist die robuste Ausprägung des allgemeinen Outbox-Patterns.
Typische Einsatzfelder:
- Microservices mit Database-per-Service
- Event-Driven Architecture
- Saga-Koordination
- CQRS / Read-Model-Projektionen
Grundprinzip
Kernaussage:
- Domain-Write und Event-Erzeugung sind atomar
- Publish erfolgt asynchron
- Delivery ist mindestens einmal garantiert
Zentrale Eigenschaften
1️⃣ Gleicher Transaktionskontext
Domain-Änderung + Outbox-Insert:
- erfolgen im selben DB-Commit
- sind damit atomar konsistent
Kein „DB erfolgreich, Event verloren“-Szenario.
2️⃣ At-Least-Once Delivery
Das Pattern garantiert:
- mindestens einmalige Zustellung
Es garantiert nicht:
- Exactly-once
Daher Pflicht:
- Idempotente Consumer
- Eindeutige Event-IDs
3️⃣ Relay-Varianten
🟢 Polling-Relay
- Periodisches Lesen der Outbox
- Einfach zu implementieren
- Gut verständlich
🟡 CDC-basiertes Relay
- Streaming aus DB-Log (z. B. Debezium)
- Niedrige Latenz
- Weniger Polling-Overhead
🔵 Log-Tailing
- Direktes Lesen des Write-Ahead-Logs
- Hohe Effizienz
- Infrastrukturintensiver
4️⃣ Monitoring-Anforderungen
Wichtige Metriken:
- Relay-Lag
- Unverarbeitete Events
- Dead Letter Queue
- Publish-Fehler
Ohne Observability wird Outbox unsichtbar kritisch.
Vorteile
- Keine verteilten Transaktionen
- Konsistente Kopplung von State und Event
- Stabil bei Broker-Ausfällen
- Grundlage für Saga und CQRS
Risiken / typische Fallstricke
1️⃣ Fehlende Idempotenz
Ohne idempotente Verarbeitung:
- doppelte Buchungen
- doppelte Reservierungen
- Seiteneffekte
2️⃣ Relay-Lag
Verzögerungen erzeugen:
- temporäre Inkonsistenzen
- Prozessverzögerungen
Eventual Consistency ist inhärent.
3️⃣ Outbox-Wachstum
Ohne Cleanup:
- Tabelle wächst unkontrolliert
- Performance leidet
Retention-Strategie ist notwendig.
4️⃣ Verwechslung mit Messaging-Garantie
Transactional Outbox:
- garantiert keine End-to-End-Konsistenz
- ersetzt kein durchdachtes Prozessmodell
Sie löst nur das Atomaritätsproblem.
Wann sinnvoll?
- Events sind fachlich kritisch
- Services sind entkoppelt
- Database-per-Service im Einsatz
- Saga oder Read-Projektionen notwendig
Wann unnötig?
- Monolith ohne Messaging
- Best-Effort-Events ausreichend
- Kein Event-Broker im Einsatz
Strategische Perspektive
Transactional Outbox ist:
- kein Business-Pattern
- kein Performance-Pattern
- kein Architektur-Statement
Es ist ein Integrations-Sicherheitsnetz.
Es verschiebt Komplexität von:
- verteilten Transaktionen
zu:
- Idempotenz
- Monitoring
- Messaging-Betrieb
Fazit
Transactional Outbox sorgt dafür, dass:
„Was gespeichert wurde, wird auch publiziert.“
Sie garantiert:
- At-least-once Delivery
- Keine verlorenen Events
Sie erfordert:
- Idempotente Consumer
- Monitoring
- Betriebsdisziplin