Start with an inventory, not with architecture. Pull the query log for a representative week and group statements by normalized fingerprint, then attach four facts to each: call volume, p50 and p99 latency, which tables it touches, and who consumes the result. Only the combination of "read-only, high volume, latency-sensitive, staleness-tolerant" earns a place in the first wave.
Two filters do most of the work. First, reject anything that runs inside a transaction that also writes, because moving half a transaction to another host breaks atomicity. Second, reject anything whose result feeds directly into a write decision (balance checks, inventory reservations, uniqueness validation). Shopify's engineering team describes the core hazard precisely: an individual stale read is usually harmless, but a set of related reads split across replicas with different lag can assemble an incoherent picture, and if that picture informs later writes, the damage compounds read consistency with replicas.
For the survivors, write down the staleness budget in seconds. This is a product decision, not an engineering one, and it should live in the same repository as the query:
| Query class | Example | Staleness budget | Eligible for edge? |
|---|---|---|---|
| Catalog browse | Product listing, category pages | 60s | Yes, cache first |
| Profile display | Public profile, avatar, bio | 30s | Yes |
| Feed / timeline | Social or activity feed | 5s | Yes, with lag guard |
| Search suggestions | Autocomplete | 2s | Only with local index |
| Cart contents | Line items before checkout | 0 (read your writes) | No |
| Inventory count | Stock before add-to-cart | Near 0 | No |
| Balance / entitlement | Wallet, plan limits | 0 | No |
| Auth session lookup | Token to user resolution | 0 | Session store only |
The last row deserves emphasis because it is where teams get burned. Authentication looks like a read, but a stale result means a revoked token still works or a valid one is rejected. Keep that lookup in a store designed for it rather than in a replicated relational table.
Output of step 1: a short ranked list, ideally five to fifteen queries, each with an owner, a staleness budget and a documented consumer contract.



