跳到主要内容
约 4 分钟2 张卡

服务容错

服务容错通过熔断、降级与舱壁减少故障扩散。本文负责健康状态机、业务回退和资源隔离。

1. 面试核心​

先记住这几条,再读正文
  • 熔断与降级。 熔断按依赖健康暂停调用,降级定义失败后的业务结果。卡 · 超时
  • 舱壁隔离。 舱壁为依赖或租户分配独立并发、连接与队列额度。
  • 熔断样本。 Resilience4j 熔断需达到最小样本数后再比较失败率。卡 · 窗口与并发额度
  • 半开探测。 半开状态只放有限探测,用结果判断恢复。
  • 并发限制。 熔断滑动窗口记录结果,并不限制并发调用数。卡 · 窗口与并发额度

2. 超时​

超时约束单次等待,具体预算与取消见超时。熔断则根据历史结果决定后续请求是否放行。

慢调用尚未完成时,失败率统计也尚未完整。并发资源还需由舱壁及时约束。

3. 熔断器状态​

以 Resilience4j 的常规状态为例:

状态行为
Closed放行并记录调用结果
Open快速拒绝,等待恢复探测
Half-open放行有限探测,判断恢复或重新打开

统计可使用时间窗口或计数窗口。最小样本数用于避免少量错误触发比例误判。低流量接口需单独校准窗口与样本要求。

4. 熔断维度​

维度按共享故障资源选择,例如后端集群或 API。划分过粗会扩大拒绝范围,过细会导致样本不足。

失败分类也需显式配置。参数错误和预期业务拒绝可排除。连接错误、超时和下游异常按目标语义纳入。

5. 半开探测​

半开状态限制探测数量,避免突然恢复全部流量。成功比例达标后再恢复,失败则重新打开。

Resilience4j 默认由到期后的新调用触发半开。开启自动转换选项后,可由监控线程触发。多个实例同时恢复时,还需错开探测时间。

6. 降级​

降级结果由业务风险决定:

  • 可接受陈旧结果时返回带时间的缓存。
  • 非关键模块失败时省略对应内容。
  • 已持久化任务可以返回异步受理状态。
  • 高风险写操作可明确拒绝,并提供查询入口。

备用服务需先验证容量与数据兼容。余额、库存和权限使用准确状态,避免误导性默认值。

7. 舱壁隔离​

舱壁为不同依赖分配线程池、信号量或连接池。慢依赖占满自身额度后,其他路径仍有资源。

线程池隔离还能分离执行队列,但有调度成本。信号量隔离直接限制并发,使用调用方线程。

隔离过细会降低资源利用率。关键路径可保留额度,再用真实流量校准。虚拟线程仍会消耗连接、内存和下游容量。

8. 组合顺序​

装饰器顺序会改变统计口径。例如 Retry 包在 CircuitBreaker 外,每次尝试都经过熔断器。反向包装则让熔断器主要看到最终结果。

设计时应明确每次尝试是否计入故障率。已打开的熔断拒绝应从可重试错误中排除。舱壁满时也应快速退出,避免反复申请资源。

所有尝试共享总时限。退避细节见重试。降级路径也有独立的容量和等待上限。

9. 效果验证​

观测状态、样本数、打开原因与半开结果。舱壁需记录 active、queue 与 reject。

保护生效后,核心业务应保持可用。持续 Open 或持续降级说明底层故障仍在。应继续修复依赖与容量问题。

10. 窗口与并发额度​

以下为 Resilience4j 的示例参数,并非默认值:

slidingWindowType=COUNT_BASED
slidingWindowSize=100
minimumNumberOfCalls=20
failureRateThreshold=50
permittedNumberOfCallsInHalfOpenState=3

完成样本不足 20 时,即使全部失败也未达到统计门槛。记录 20 次且失败率达到 50% 时,才满足失败率打开条件。

窗口 100 表示保留最近 100 次调用结果。它与最多 100 个并发无关。并发 20 的目标需另外配置舱壁额度。

Envoy 的 circuit breaking 主要配置资源上限。按错误摘除实例属于 outlier detection。选型时需区分这些名称下的具体机制。

11. 常见问题​

11.1 熔断与限流​

限流根据容量或配额拒绝请求。熔断根据近期故障停止调用。健康依赖也会触发配额限制。

11.2 备用依赖的切换条件​

12 · 面试题卡片​

12.1 熔断、降级、限流和舱壁分别解决什么问题​

出现公司:阿里巴巴、京东、拼多多、快手

考察重点

  • 理解熔断状态机、样本窗口和半开探测。
  • 理解降级结果的业务语义。
  • 理解舱壁资源隔离与限流容量保护。

相关内容:超时至效果验证。

参考回答

熔断按健康状态暂停调用,降级定义失败后的业务结果。

舱壁隔离并发与连接等资源,限流控制入口配额。它们处理不同的故障传播环节。

熔断器通过窗口样本与半开探测判断状态。资源上限由舱壁独立执行。降级可返回旧缓存或异步受理,但需符合业务语义。指标同时验证保护触发原因与核心业务结果。

12.2 熔断窗口设为 100,就最多允许 100 个并发吗?​

出现公司:暂无已核验的公开来源(本站自测)

考察重点:统计窗口、样本门槛与舱壁额度。

相关内容:窗口与并发额度。

参考回答

计数滑动窗口设为 100,表示记录最近 100 次调用结果;并发调用数由舱壁等资源限制控制。

例如,minimumNumberOfCalls=20 要求至少收集 20 次结果,之后才按 failureRateThreshold=50 判断失败率。半开阶段可用 permittedNumberOfCallsInHalfOpenState=3 单独限制探测次数。

13. 参考资料​