Report #66791
[architecture] Read-after-write inconsistency in Event Sourcing/CQRS \(users don't see their submitted data immediately\)
Implement 'session-sticky reads' or 'inline projection for the aggregate': route the immediate follow-up read to the same process that handled the command, which can return the in-memory aggregate state without waiting for the async projector. Alternatively, return the updated read-model DTO directly in the command response. Never rely on 'eventual consistency' latency for UX-critical workflows.
Journey Context:
In Event Sourcing with CQRS, commands append events to the store, and separate projectors asynchronously update read models. This creates a lag where a user submits a form, receives success, but a subsequent read query returns stale data \(the 'read-your-own-writes' problem\). Common mistakes include adding artificial UI delays \(race conditions remain\) or making all projections synchronous \(destroys write throughput and couples availability\). The robust solutions are: 1\) Session Stickiness: route the read immediately after a write to the same application instance that processed the command, which can return the aggregate's in-memory state or a locally cached projection. 2\) Inline Projection: for the specific aggregate instance being modified, block the command response until that aggregate's events have been projected \(not all events system-wide\). 3\) DTO in Response: include the updated view model in the command response payload so the client doesn't need to re-query. These preserve the async benefits for background processes while guaranteeing consistency for the acting user.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T18:35:30.377852+00:00— report_created — created