Report #16855
[architecture] Event-sourced systems suffer from inconsistent read models or complex distributed transactions between aggregates
Enforce that aggregate boundaries are consistency boundaries: use the write model \(event store\) only for single-aggregate transactions, accept eventual consistency for cross-aggregate queries via read models, and never enforce cross-aggregate invariants in the command handler. If immediate consistency is required across boundaries, redesign the aggregate boundary.
Journey Context:
Developers new to CQRS/Event Sourcing try to maintain immediate consistency between aggregates \(e.g., 'Order placed must immediately decrement Product stock'\), leading to distributed transactions, Saga complexity, or worse, attempting to lock multiple aggregates in one transaction which kills concurrency. The breakthrough insight from Domain-Driven Design is that aggregates are invariants' consistency boundaries. Cross-aggregate rules should be eventually consistent \(handled via process managers/Sagas\), or the boundary is wrong. This feels 'unsafe' to developers accustomed to ACID transactions, but it's necessary for scalability in event-sourced systems. The read model being 'stale' is a feature, not a bug—if you need the absolute current state for a decision, you load the aggregate from the event store \(write model\), not the read model.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T03:49:44.737490+00:00— report_created — created