服务降级

解决方案概述

核心思路

  • 当缓存不可用时,自动降级
  • 限制外部 API 访问,保护核心功能
  • 返回缓存数据或默认值
设计流程
解决方案概述
  1. 步骤 1:写入缓存值、空值标记或热点保护状态
  2. 步骤 2:准备缓存 key、TTL、回源路径和保护策略
  3. 步骤 3:记录命中率、回源次数和异常 key 分布
  4. 步骤 4:按命中、未命中和异常 key 处理读取与回源
关注点:命中率、回源压力、TTL 和异常 key 处理。

降级层次

┌─────────────────────────────────────┐
│         Level 1: Redis 缓存          │  ← 正常情况
├─────────────────────────────────────┤
│       Level 2: 本地缓存(进程内)      │  ← Redis 宕机
├─────────────────────────────────────┤
│         Level 3: 外部 API            │  ← 本地缓存没有
├─────────────────────────────────────┤
│        Level 4: 默认值/静态数据       │  ← 外部 API 不可用
└─────────────────────────────────────┘

完整的防护方案

设计流程
完整的防护方案
  1. 步骤 1:写入缓存值、空值标记或热点保护状态
  2. 步骤 2:准备缓存 key、TTL、回源路径和保护策略
  3. 步骤 3:记录命中率、回源次数和异常 key 分布
  4. 步骤 4:读取、刷新或失效缓存数据
关注点:命中率、回源压力、TTL 和异常 key 处理。

效果验证

实施完整防护方案后的系统指标:

防护效果对比

指标无防护随机过期+ 高可用+ 降级
集中过期风险
Redis 宕机影响100%100%0%0%
外部 API 保护部分最强
可用性95%95%99.9%99.99%

故障演练结果

故障场景测试:

1. 模拟 Redis 主节点宕机
   - 故障检测时间:5 秒
   - 自动切换时间:8 秒
   - 影响请求:0.1%
   - 结果:通过 ✅

2. 模拟 10000 个 key 同时过期
   - 外部 API 峰值:正常值 120%
   - 响应时间:增加 50ms
   - 结果:通过 ✅

3. 模拟外部 API 不可用
   - 降级响应时间:< 100ms
   - 返回本地缓存数据
   - 结果:通过 ✅

当前技术架构

练习

练习 1

请设计一个完整的缓存雪崩防护方案,包括关键状态和兜底路径。

参考答案 (3 个标签)
缓存雪崩 方案设计 高可用

参考答案

设计流程
练习 1
  1. 步骤 1:按命中、未命中和异常 key 处理读取与回源
  2. 步骤 2:按本节策略读取、写入缓存并处理过期或失效
  3. 步骤 3:校验身份、密钥或权限
关注点:命中率、回源压力、TTL 和异常 key 处理。

防护层次

  1. Redis 从节点读(减轻主节点压力)
  2. Redis 主节点(从节点不可用时)
  3. 本地缓存(Redis 集群不可用时)
  4. 外部 API(最后的数据来源)

关键点

  • 使用 Sentinel 实现自动故障转移
  • 读写分离(从节点处理读请求)
  • 随机过期时间避免集中失效
  • 本地缓存作为最后防线