目标
缓存层挂掉时,天真的默认行为是全部请求直奔源站,把一次故障变成两次。预先建好的降级阶梯——旧值兜底、请求合并、限流保护、写请求排队——让用户停留在变慢但仍可用的服务里,而不是 errors 满屏;恢复期的预热与逐步放量同样重要,别让第二次事故来自恢复本身。
步骤要点
- 先判故障类别:连接拒绝的宕机、超时的变慢、取值错乱的损坏,三者降级路径不同。
- 允许陈旧的数据切到“返回最后已知值加陈旧标记”,用户看到稍旧数据而不是报错。
- 放流量直连源站前先开请求合并与重型端点限流,依据预先量好的源站余量数字。
- 非关键写流量(分析、计数)改走持久队列,降级模式扛不住的重写路径快速拒绝并给清晰提示。
- 恢复期谨慎排水:预热热点键、带幂等键重放队列写入、分步放量盯源站负载。
排错提示
直连后源站 CPU 打满说明限流没先上,把降级开关顺序固化为“先合并限流再放直连”;旧值兜底用在了支付余额这类不可陈旧数据上是分类没做,建 staleness 预算表供降级引用;恢复即二次故障是冷缓存踩踏,预热热点集合并小步放量。
适用边界
降级阶梯依赖源站有余量,长期余量不足的系统要先扩容再谈降级;陈旧兜底对强一致数据不适用,这类路径只能快速失败。
代码示例
degradation ladder (cache failure):
L0 normal: cache hit 96%, origin 4%
L1 slow cache: timeouts -> stale-while-revalidate
L2 cache down: serve stale (catalog: 10 min)
+ coalesce misses (5s window)
+ shed heavy endpoints (p99 guard)
L3 origin risk: queue non-critical writes
+ defer batch jobs
chaos drill result (L2, 15 min):
availability 99.4% (SLO floor 99.0%)
origin p99 640ms (guard 800ms)
user impact: slower, stale-tagged, no errors