服务降级策略怎么设计?
简化版
服务降级是在资源不足或依赖异常时,主动关闭非核心能力、降低结果精度或改用缓存,从而保住核心链路。 设计重点是先定义业务优先级,再为每项能力明确触发条件、降级结果、数据语义和恢复条件;降级不能把失败伪装成成功。
详细版
先把功能分为不可降级、可损失体验、可延后处理三类。例如下单扣款不可返回假成功,推荐可以返回热门榜单,积分发放可记录待处理事件后异步补偿。触发信号可来自错误率、P99、线程池水位、依赖熔断或人工开关,并要求持续多个窗口,避免瞬时抖动。
降级规则要包含作用范围、优先级、TTL、审批人、审计记录和自动退出门槛。恢复采用阶梯放量,不应指标刚好转就全量开启。上线前必须验证默认值是否会污染缓存、影响计费或破坏客户端契约。
完整版教学
一、降级是在做业务取舍
机器资源有限,故障时不可能让所有功能保持同一质量。降级把资源优先给登录、交易、支付等核心路径,牺牲装饰、推荐、统计或实时性。它与“代码报错后随便返回空”不同,前者是事先评审过的产品行为,后者可能制造静默数据错误。
心法:先回答“最坏时必须保住什么”,再决定“哪些体验可以暂时变差”。
二、建立能力分级清单
| 等级 | 示例 | 故障时动作 | 数据要求 |
|---|---|---|---|
| L0 核心写 | 扣款、下单 | 限流或明确失败 | 不能假成功 |
| L1 核心读 | 订单查询 | 缓存、只读副本 | 标注可能延迟 |
| L2 体验功能 | 推荐、评论数 | 默认值或静态榜单 | 可短暂陈旧 |
| L3 延后任务 | 积分、通知 | 入待办队列 | 最终补偿 |
同一服务里的接口也可能属于不同等级,不能按“服务名”粗暴开关。清单还应标出依赖、资源占用、负责人和最大允许降级时间,事故中才能快速决策。
三、降级形态与语义边界
常见形态有关闭入口、返回缓存、降低精度、减少字段、转异步和只读模式。选型取决于调用契约:搜索可从个性化排序退到关键词排序,但库存不能把未知数量当作充足。返回缓存时应携带数据时间或降级标志,让调用方知道结果质量变化。
{
"items": [],
"degraded": true,
"reason": "RECOMMENDATION_UNAVAILABLE",
"dataAsOf": "2026-09-30T10:00:00Z"
}
四、自动触发必须防抖
假设推荐依赖平时 P99 为 180ms,可设置连续 3 个 10 秒窗口 P99 超过 800ms 且错误率超过 5% 才进入降级。两个条件组合能减少单个异常样本误触发。人工开关用于指标未覆盖的新故障,但必须有双人审批、操作审计和 TTL,防止永久遗忘。
NORMAL --阈值连续超标--> DEGRADED
DEGRADED --健康5个窗口--> RECOVERING
RECOVERING --10%/30%/100%放量--> NORMAL
RECOVERING --再次恶化--> DEGRADED
五、容量数字如何证明有效
某实例最多稳定处理 1200 QPS,其中核心链路 800 QPS、推荐 500 QPS、统计 200 QPS,总需求 1500 QPS。关闭统计并把推荐降到 100 QPS 后,总量变为 900 QPS,才真正回到容量线下。如果降级动作只省 20 QPS,就算开关成功也无法止血。
评审每项策略时要估算释放多少线程、连接、CPU 或下游 QPS。否则“降级了页面角标”与数据库连接池耗尽没有因果关系。
六、恢复比进入更谨慎
故障刚恢复时缓存可能冷、积压仍高、下游还在回放数据。直接全量恢复会造成二次峰值,所以先小流量验证,再逐级开放。恢复判据既看依赖健康,也看本地队列与连接池水位;旧降级缓存还要设版本和过期时间,避免恢复后继续覆盖新结果。
观测要区分原始失败、降级命中和真实成功。若把降级响应都算成功,SLA 看板会一片绿色而用户只能看到空页面。业务指标如支付转化、搜索零结果率同样是必要信号。
七、常见误区与追问
- 误区:降级就是统一返回空对象。 空值可能违反客户端约定,也可能掩盖核心写操作失败。
- 误区:有熔断器就不需要降级设计。 熔断决定是否调用,降级决定不调用后向用户提供什么。
- 误区:指标恢复就立刻全量退出。 冷缓存和积压会制造第二次冲击,应阶梯恢复。
- 误区:人工开关可以没有有效期。 长期开启会让功能悄悄失效,必须 TTL 与提醒。
- 追问:降级数据能否写缓存? 可以,但要用独立标记和短 TTL,避免污染正常结果。
- 追问:如何测试降级? 注入依赖超时与过载,核对触发时间、释放容量、响应语义和恢复路径。
- 追问:客户端不认识新降级字段怎么办? 保持原协议兼容,同时用状态码、旧字段合法值和灰度验证处理。
八、加强记忆
服务降级可以记成“分级、触发、替代、标识、恢复”:给能力排业务优先级,用组合阈值或审计开关触发,选择不破坏业务语义的替代结果,让调用方和监控看见降级,最后按阶梯恢复。把释放容量的数字算出来,才能证明策略真的保护了核心链路。