← 中文资源

简体中文版本

缓存故障优雅降级工作流

缓存层故障时切换降级模式:旧值兜底、直连源站加限流、写请求排队,守住核心链路。

阅读英文原文

目标

缓存层挂掉时,天真的默认行为是全部请求直奔源站,把一次故障变成两次。预先建好的降级阶梯——旧值兜底、请求合并、限流保护、写请求排队——让用户停留在变慢但仍可用的服务里,而不是 errors 满屏;恢复期的预热与逐步放量同样重要,别让第二次事故来自恢复本身。

步骤要点

  1. 先判故障类别:连接拒绝的宕机、超时的变慢、取值错乱的损坏,三者降级路径不同。
  2. 允许陈旧的数据切到“返回最后已知值加陈旧标记”,用户看到稍旧数据而不是报错。
  3. 放流量直连源站前先开请求合并与重型端点限流,依据预先量好的源站余量数字。
  4. 非关键写流量(分析、计数)改走持久队列,降级模式扛不住的重写路径快速拒绝并给清晰提示。
  5. 恢复期谨慎排水:预热热点键、带幂等键重放队列写入、分步放量盯源站负载。

排错提示

直连后源站 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