知识卡片
熔断与降级的本质区别:应对自身故障,还是依赖方故障
内容
熔断和[[降级:丢车保帅的核心思想,及两种实现方式的取舍]]名字看起来都有”禁止某个功能”的意味,很容易混淆,但两者应对的问题本质不同:降级应对的是系统自身的故障,熔断应对的是系统所依赖的外部系统出故障的情况。设想一个场景:A服务的X功能依赖B服务的某个接口,一旦B服务这个接口响应变慢,A服务的X功能自然被拖慢,进而A服务的线程可能大量卡在处理X功能上,最终导致A服务的其他功能也跟着被拖慢甚至一起卡死——这时候就需要熔断:A服务发现是在请求B服务这个出问题的接口时,直接立即返回错误、不再真正发起请求,从而避免整个A服务被B服务的问题连累拖垮。熔断机制要真正落地有两个关键点:一是必须有一个统一的API调用层,由这一层来统一做采样和统计,如果各处代码各自零散地调用接口,就没法做统一的熔断判断;二是阈值设计要合理——比如设定”1分钟内30%的请求响应时间超过1秒就触发熔断”,这里的”1分钟”“30%”“1秒”每一个参数都会实际影响熔断效果,实践中一般是先根据经验分析定一个初始阈值,上线后观察实际效果,再逐步调优,而不是指望一次性设计出完美的阈值。
参考来源
- 位置:《从零开始学架构》第31讲《如何应对接口级的故障?》"熔断"(源文件:_epub-src/OEBPS/text00002.html)
- 结论依据:原文说明"降级的目的是应对系统自身的故障,而熔断的目的是应对依赖的外部系统故障的情况……A 服务不再请求 B 服务的这个接口,A 服务内部只要发现是请求 B 服务的这个接口就立即返回错误",并指出"熔断机制实现的关键是需要有一个统一的 API 调用层……另外一个关键是阈值的设计",直接支撑本卡片结论。
- 原始内容:降级的目的是应对系统自身的故障,而熔断的目的是应对依赖的外部系统故障的情况……熔断机制实现的关键是需要有一个统一的 API 调用层,由 API 调用层来进行采样或者统计……熔断机制实现的另外一个关键是阈值的设计。