熔断、降级与舱壁隔离
熔断器在依赖持续异常时暂时停止调用,降级决定无法获得完整结果时返回什么,舱壁则限制一个依赖最多占用多少资源。三者共同减少故障扩散,但处理的对象不同。
1. 超时先限制单次等待
每个远程调用首先要有 deadline。没有超时,线程和连接会一直等待;只有超时而没有并发上限,大量慢请求仍能在超时前耗尽资源。
熔断器不是超时替代品。它根据一段时间内的调用结果决定是否允许新的请求进入,单次调用仍需自己结束。
2. 熔断器在三种状态间切换
- Closed:正常放行,并统计满足条件的请求。
- Open:直接拒绝调用,让依赖和本服务释放资源。
- Half-open:冷却一段时间后只放少量探测请求,根据结果决定恢复或重新打开。
统计通常使用滑动窗口,并设置最小样本数、失败率或慢调用比例。只有两次请求就按 50% 失败率打开,会对低流量接口过度敏感。
3. 熔断维度不能过粗
一个下游的某个接口变慢,不代表所有接口和实例都异常。熔断可以按目标集群、API、错误类别和调用优先级划分。
维度过粗会扩大拒绝范围,维度过细则产生大量状态和小样本误判。应从共享故障资源出发,例如同一线程池、数据库或后端集群。
客户端取消、参数错误和业务拒绝通常不应计入依赖故障率;超时、连接错误和明确的服务端异常则需要纳入。
4. 半开探测限制恢复流量
冷却时间到达后若立即恢复全部请求,尚未稳定的依赖可能再次被打垮。Half-open 只允许少量探测,并限制并发;连续或达到比例的成功后再逐步恢复。
多个调用方各自熔断时可能同时探测,应增加随机抖动,或由共享治理层控制恢复速率。
5. 降级需要业务定义
降级不是统一返回“系统繁忙”。可选结果包括:
- 返回可接受的旧缓存,并标明时间。
- 省略推荐、画像等非关键字段。
- 将同步工作转为持久化异步任务。
- 对写操作拒绝并提供查询或重试入口。
- 切换经过容量验证的备用依赖。
备用服务也可能被全量流量压垮,切换应有容量上限和逐步放量。涉及余额、权限和库存时,不应返回会导致错误决策的默认值。
6. 舱壁隔离限制故障占用资源
借鉴船舶隔舱,舱壁为不同依赖、租户或优先级分配独立的线程池、信号量、连接池或队列。一个慢依赖占满自己的额度后,其他路径仍有资源可用。
隔离会降低资源共享效率,池划分过细也会产生大量空闲容量。可以保留公共池加关键路径保底额度,并通过真实流量校准。
虚拟线程减少平台线程占用,但数据库连接、内存和下游容量仍有限,舱壁并不会因此失去作用。
7. 保护机制要按顺序组合
一个调用路径可以按以下顺序考虑:
- 入口限流控制到达量。
- 舱壁限制进入某依赖的并发和排队。
- 超时限制每次调用。
- 有限重试处理瞬时故障。
- 熔断在持续异常时快速拒绝。
- 降级给出可接受结果。
这些机制共享同一个请求预算。重试不能越过熔断和舱壁继续制造流量,降级也要设置自己的超时与容量。
8. 用状态和结果验证保护效果
监控熔断状态、窗口样本、打开原因、半开探测、快速拒绝、降级命中和各舱壁的 active、queue、reject。还要观察保护开启后核心业务是否真的保持可用。
长期处于 open 或持续降级说明依赖故障或容量缺口尚未解决,不能算作治理成功。告警应能找到具体下游和阈值版本。
9. 常见问题
9.1 熔断和限流有什么区别
限流根据容量或配额限制进入量,即使依赖健康也可能拒绝;熔断根据近期异常暂时停止调用一个不健康依赖。两者都快速失败,但触发信号和保护对象不同。
9.2 熔断器打开后是否应该自动切备用服务
只有备用服务语义兼容、数据足够新且容量经过验证时才可以。自动把全量流量切向未经保护的备用系统,可能造成第二次故障。
10. 面试题
10.1 熔断、降级、限流和舱壁分别解决什么问题
出现公司:阿里巴巴、京东、拼多多、快手
考察重点
- 熔断状态机、样本窗口和半开探测。
- 降级结果的业务语义。
- 舱壁资源隔离与限流容量保护。
相关内容:第 1 节“超时先限制单次等待”至第 8 节“用状态和结果验证保护效果”。
参考回答
限流根据系统容量或租户配额控制进入速率和并发;舱壁给不同依赖或业务分配独立线程、连接和队列额度,防止一个慢路径占满共享资源。超时结束单次等待,熔断器则根据滑动窗口中的失败或慢调用,在 closed、open、half-open 间切换,持续异常时快速拒绝,恢复时只放少量探测。
降级决定失败后业务返回什么,例如旧缓存、缺少非关键字段、异步受理或明确拒绝。它必须符合数据风险,不能给余额或权限返回误导默认值。所有机制共享端到端预算,并用熔断原因、快速拒绝、舱壁饱和和核心业务结果验证。