The Dual-Write Problem (and How to Actually Fix It)
Once you split a monolith into services, your familiar BEGIN/COMMIT stops working. The dual-write problem means you can't atomically update a database and publish an event — one will always fail independently of the other, leaving your systems silently out of sync.
The textbook answer is two-phase commit (2PC), but it blocks on coordinator failure, requires XA support, and tanks availability. The practical answer is the transactional outbox: write the event into an outbox table inside the same DB transaction as your business data, then let a relay publish it to your broker. For multi-service operations, sagas coordinate a sequence of local transactions with explicit compensating actions — but compensation isn't rollback. A refund is a new operation, not an un-charge.
Before reaching for any distributed pattern, ask whether you split too early. Redrawing service boundaries so the transaction stays local is simpler and more reliable than any coordination protocol.
Related Blogs
Event-Driven Architecture Explained: Events, Commands, and the Tradeoffs Nobody Mentions
- Published on
- Reading time
- 6 min read
Exactly Once vs At Least Once: What Kafka's Guarantee Actually Covers
- Published on
- Reading time
- 6 min read
CQRS Explained: It's Just Two Models, Not a Whole Architecture
- Published on
- Reading time
- 6 min read