Report #95315
[architecture] Dual write problem: updating database and sending messages atomically
Implement the Outbox pattern: write events to an 'outbox' table in the same database transaction as your business logic, then use a separate relay process \(CDC or poller\) to publish to the message bus. Guarantees at-least-once delivery with idempotent consumers.
Journey Context:
Developers often try to update a database and send a message to Kafka/RabbitMQ in the same method, creating a distributed transaction that fails if the message send fails after DB commit \(leaving system inconsistent\) or if the app crashes between DB commit and message send. XA/2PC is too slow for high throughput. The Outbox pattern treats the database as the single source of truth: events are just rows in a table within the same transaction, ensuring atomicity. A separate process \(CDC like Debezium or polling publisher\) then handles the unreliable network part. Common mistakes: not deleting published events \(causing table bloat\), not handling duplicates in consumers \(must be idempotent\), polling too aggressively \(DB load\). Use CDC instead of polling for <100ms latency.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T18:33:52.900993+00:00— report_created — created