Resilience Patterns · Resilient Data and Dependencies
Caching for Resilience
Serve stale data instead of errors when origins fail.
Caches can do more than speed things up: with stale-if-error and stale-while-revalidate, CDNs and application caches keep serving the last good response when the origin fails. Keep a longer "stale TTL" alongside the fresh TTL, coalesce refreshes, and prevent cold-cache stampedes after restarts by warming critical keys. Beware: if the system can't run without the cache, the cache is now a critical dependency that needs its own redundancy.
Resilient caching techniques
| Directive / technique | Effect |
|---|---|
| Cache-Control: stale-if-error=86400 | Serve stale up to 1 day when origin errors |
| stale-while-revalidate=60 | Serve stale while refreshing in background |
| Soft TTL + hard TTL in app cache | Refresh after soft TTL; serve stale until hard TTL on failure |
| Request coalescing | One origin fetch per key during misses |
| Cache warming | Avoid cold-start stampedes |
Python (soft/hard TTL)
async def get_with_stale(key: str, load, soft_ttl=60, hard_ttl=3600):
entry = await cache.get(key) # {"value":..., "fetched_at":...}
fresh = entry and time.time() - entry["fetched_at"] < soft_ttl
if fresh:
return entry["value"]
try:
value = await load()
await cache.set(key, {"value": value, "fetched_at": time.time()}, ex=hard_ttl)
return value
except DependencyError:
if entry: # origin down: serve stale
metrics.increment("cache.stale_served")
return entry["value"]
raise
Common pitfalls
- Systems that can't start without a warm cache.
- Serving stale data for correctness-critical values (balances, stock at checkout).
- No metric for stale responses.
Key points
- stale-if-error / soft+hard TTLs
- Coalesce and warm
- Know which data may be stale
Further reading: RFC 5861: stale-while-revalidate and stale-if-error
Practice questions
What does stale-if-error do?
Answer
It allows caches to serve a stale cached response for a specified time when the origin returns an error or is unreachable.
Why can a cache become a critical dependency?
Answer
If origin capacity can't handle traffic without the cache's hit ratio, losing or cold-starting the cache overloads the origin, so the cache needs redundancy and warming.
Open in the app to mark lessons complete, take notes and track your progress.