You're designing a new cloud service and a colleague proposes building it with CQRS and full event sourcing from day one because 'it's the scalable, cloud-native way to do it.' When would you push back on that default?
answer
- no free lunch — cost precedes benefit
- low scale = no asymmetry to exploit
- strict consistency domains fight the pattern
- operational maturity to run the pipeline
- CQRS and ES are separable decisions
basics
~20 sWhen the service is small, simple, or needs strict instant consistency — the extra moving parts (two models, an event log, projectors) cost more in complexity than they save, and a plain database with normal reads/writes does the job fine.
solid answer
~40 sI'd push back whenever the read/write asymmetry and scaling need that justify CQRS+ES don't actually exist yet: low-traffic or early-stage services, domains without a real audit/history requirement, or teams without the operational maturity to run and monitor an event log and projection pipeline. I'd also push back when the domain needs strict, immediate consistency on reads unless the team is prepared to add read-your-writes machinery on top. The pattern earns its cost when there's genuine read/write scaling divergence, a real need for multiple denormalized views, or a compliance/audit requirement for full history — not by default. A simpler CRUD-with-a-single-database design, with CQRS/ES introduced later if and when the asymmetry becomes real, is usually the better starting point.
go deeper
Should be able to say that this pattern adds complexity and isn't automatically the right choice for every service, even at a high level.
Should name at least one concrete situation (low scale, or a need for instant consistency) where the pattern is a poor fit.
Should articulate multiple concrete disqualifying conditions (scale, consistency requirements, team readiness, audit need) and know CQRS and event sourcing can be adopted independently.
Should reason about applying the decision selectively per bounded context within a larger platform, and frame the adoption decision as an ongoing organizational commitment, not just a one-time technical choice.
## Not a free upgrade CQRS with event sourcing is a powerful pattern, but it is not a free upgrade — it trades simplicity for capabilities that a given service may or may not actually need: - independent read/write scaling; - multiple denormalized views; - full auditable history; - temporal queries. As a senior engineer, the right response to 'let's do CQRS+ES because it's cloud-native and scalable' is to ask what specific problem it's solving here, because in a meaningful fraction of cases the honest answer is 'none yet,' and adopting it anyway is taking on real cost for hypothetical future benefit. ## Scale that isn't there yet The first case to push back on is scale that doesn't exist. CQRS earns its complexity when read and write load genuinely diverge enough that scaling them together is wasteful, or when multiple consumers need meaningfully different denormalized views of the same data. A brand-new service, an internal tool, or anything pre-product-market-fit typically doesn't have that asymmetry yet — traffic is low, the data shape is still changing, and a single well-indexed relational database easily handles both reads and writes with room to spare. Building the two-model, event-log, projector-pipeline machinery for that workload means paying operational cost for scaling headroom nobody is using. ## A strict consistency requirement The second case is a strict consistency requirement that fights the pattern's core tradeoff. Event sourcing with asynchronous projections is fundamentally eventually consistent between write and read sides. Domains where a read must reflect the absolute latest write with no exceptions — for example, checking an account has sufficient balance immediately before authorizing a debit, where stale data could allow an overdraft — either need read-your-writes machinery (added complexity again) or are simply a poor fit, and are often better served by a single, strongly-consistent transactional store for that specific check, even if other parts of the same system do benefit from CQRS. ## Team and organizational readiness The third case is team and organizational readiness. Running an event-sourced write model and a projection pipeline is an ongoing operational commitment: - someone owns event schema evolution and versioning as the domain model changes over time; - someone monitors and responds to projector lag and poison-pill events; - someone owns the replay/rebuild runbook for when a projection needs reconstructing. A small team without experience operating this kind of pipeline, or without the on-call maturity to notice and fix a stuck projector, will feel this cost immediately and constantly, often more than the scaling benefit is worth at their current size. ## A domain with no history or audit need The fourth case is a domain without a genuine history/audit need. One of event sourcing's real, distinct benefits — beyond CQRS itself — is a complete, immutable history of every state change, useful for audit trails, debugging 'how did we get into this state,' and temporal queries. If a domain has no such requirement and the CRUD-style 'current state only' model is genuinely sufficient, event sourcing's append-only, replay-based mechanics add cost without buying anything the team will use. ## The pragmatic default None of this means CQRS+ES is a bad pattern — it means it's a pattern with a real activation cost that should be justified by a real need, not adopted preemptively as an assumed best practice. A pragmatic default for a new cloud service is to start with a straightforward single-model CRUD design, keep write-side logic reasonably well-isolated so a later migration isn't a full rewrite, and introduce CQRS — and, separately, event sourcing, since they're independent decisions that are often bundled together but don't have to be — once a concrete, observed need shows up: - read load that's meaningfully outpacing writes; - a genuine need for several differently-shaped read views; - a compliance mandate for full auditability. ## Where it shows up A concrete real-world shape of this judgment call: a startup's early billing service starts as a conventional CRUD service on a single relational database. Only after it grows into a platform serving multiple downstream consumers — a customer-facing invoice view, an internal reconciliation dashboard, and a compliance audit requirement — does the team introduce event sourcing for the ledger (for the audit trail) and CQRS projections for the now-genuinely-different read views, rather than having built that machinery speculatively on day one when none of those needs yet existed.
- Are CQRS and event sourcing the same decision, or can you adopt one without the other?They're separable. You can do CQRS with a conventional mutable write database and no event log at all — just a separate read replica or denormalized read store kept in sync some other way. You can also do event sourcing without CQRS, by rebuilding current state from the log on every read instead of maintaining separate projections. They're commonly paired because event sourcing gives a convenient event stream to project from, but neither requires the other.
- If a service has strict consistency needs in one area but real scaling needs elsewhere, do you have to pick one pattern for the whole service?No — it's reasonable to apply CQRS/event sourcing selectively, per subdomain or bounded context, rather than uniformly across an entire service. A payments-authorization path might stay on a single strongly-consistent store while a reporting or catalog-browsing path adopts CQRS projections, since the tradeoffs that justify the pattern don't apply equally everywhere in a system.
- What's a concrete signal that tells you it's time to introduce CQRS into an existing service that started as plain CRUD?Recurring signals include the read path needing its own scaling/caching separate from the write path to meet latency SLAs under growing read traffic, multiple consumers repeatedly needing differently-shaped views of the same underlying data, or a new compliance/audit requirement demanding full state-change history the current schema can't provide.
Like building a multi-warehouse, region-sharded logistics network for a shop that currently ships five packages a day — the architecture is genuinely better at massive scale, but at day-one volume it's pure overhead, and the shop would be better served scaling up its warehouse network only once order volume actually demands it.
saying these in an interview costs you the question
- Treats CQRS+event sourcing as a default best practice for any new cloud service
- Can't name any cost or downside of the pattern
- Doesn't recognize CQRS and event sourcing as separable decisions
- Applies the pattern uniformly to a whole system rather than considering it per bounded context
- Has no answer for how a strict-consistency requirement conflicts with the pattern