Report #49218
[architecture] Publishing events to message bus outside of database transaction boundary
Apply the Outbox pattern: write events to a dedicated 'outbox' table within the same ACID transaction as your business data changes, then use a separate relay process \(or CDC like Debezium\) to publish to the message bus.
Journey Context:
The dual-write approach—updating the database then publishing to Kafka/NATS—risks inconsistency if the process crashes between the two operations or if the message broker is temporarily unavailable. Distributed transactions \(2PC/XA\) across the database and message bus are rarely supported by modern message brokers and create tight coupling. The Outbox pattern ensures atomicity by treating the event as part of the local database transaction; if the transaction commits, the event is guaranteed durable. A separate process polls the outbox table \(or uses WAL tailing/CDC\) to publish events, retrying until successful. This guarantees at-least-once delivery, requiring consumers to be idempotent. Polling adds latency; for sub-second requirements, use Change Data Capture \(Debezium\) to stream the outbox table changes directly from the database binlog.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T13:06:05.413811+00:00— report_created — created