news 2026/7/2 5:10:28

分布式系统关注点(8)——99%的人都能看懂的「熔断」以及最佳实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
分布式系统关注点(8)——99%的人都能看懂的「熔断」以及最佳实践

当我们工作所在的系统处于分布式系统初期的时候,往往这时候每个服务都只部署了一个节点。

那么在这样的背景下,如果某个服务A需要发布一个新版本,往往会对正在运行的其它依赖服务A的程序产生影响。甚至,一旦服务A的启动预热过程耗时过长,问题会更严重,大量请求会阻塞,产生级联影响,导致整个系统卡慢。

▲点击图片可查看大图

举个夸张的例子来形容:一幢楼的下水管是从最高楼直通到最低楼的,这个时候如果你家楼下的管道口堵住了,那么所有楼上的污水就会倒灌到你家。如果这导致你家的管道口也堵住了,之后又会倒灌到楼上一层,以此类推。

然而实际生活中一旦你发现了这个问题,必然会想办法先避免影响到自己家,然后跑到楼下让他们赶紧疏通管道。此时,避免影响自己家的办法就可被称之为「熔断」。

一、熔断是什么

熔断本质上是一个过载保护机制。这一概念来源于电子工程中的断路器,可能你曾经被这个东西的“跳闸”保护过。

▲图片来源于网络,版权归原作者所有

在互联网系统中的熔断机制是指:当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护自己以及系统整体的可用性,可以暂时切断对下游服务的调用。

做熔断的思路大体上就是:一个中心思想,分四步走

二、熔断怎么做

首先,需秉持的一个中心思想是:量力而行。因为软件和人不同,没有奇迹会发生,什么样的性能撑多少流量是固定的。这是根本。

然后,这四步走分别是:

  1. 定义一个识别是否处于“不可用”状态的策略

  2. 切断联系

  3. 定义一个识别是否处于“可用”状态的策略,并尝试探测

  4. 重新恢复正常

定义一个识别是否处于“不正常”状态的策略

相信软件开发经验丰富的你也知道,识别一个系统是否正常,无非是两个点。

  • 是不是能调通

  • 如果能调通,耗时是不是超过预期的长

但是,由于分布式系统被建立在一个并不是100%可靠的网络上,所以上述的情况总有发生,因此我们不能将偶发的瞬时异常等同于系统“不可用”(避免以偏概全)。由此我们需要引入一个「时间窗口」的概念,这个时间窗口用来“放宽”判定“不可用”的区间,也意味着多给了系统几次证明自己“可用”机会。但是,如果系统还是在这个时间窗口内达到了你定义“不可用”标准,那么我们就要“断臂求生”了。

这个标准可以有两种方式来指定。

  • 阈值。比如,在10秒内出现100次“无法连接”或者出现100次大于5秒的请求。

  • 百分比。比如,在10秒内有30%请求“无法连接”或者30%的请求大于5秒。

最终会形成这样这样的一段代码。

全局变量 errorcount = 0; //有个独立的线程每隔10秒(时间窗口)重置为0。 全局变量 isOpenCircuitBreaker = false; //do some thing... if(success){ return success; } else{ errorcount++; if(errorcount == 不可用阈值){ isOpenCircuitBreaker = true; } }

切断联系

切断联系要尽可能的“果断”,既然已经认定了对方“不可用”,那么索性就默认“失败”,避免做无用功,也顺带能缓解对方的压力。

分布式系统中的程序间调用,一般都会通过一些RPC框架进行。

那么,这个时候作为客户端一方,在自己进程内通过代理发起调用之前就可以直接返回失败,不走网络

这就是常说的「fail fast」机制。就是在前面提到的代码段之前增加下面的这段代码。

if(isOpenCircuitBreaker == true){ return fail; } //do some thing...

定义一个识别是否处于“可用”状态的策略,并尝试探测

切断联系后,功能的完整性必然会受影响,所以还是需要尽快恢复回来,以提供完整的服务能力。这事肯定不能人为去干预,及时性必然会受到影响。那么如何能够自动的识别依赖系统是否“可用”呢?这也需要你来定义一个策略。

一般来说这个策略与识别“不可用”的策略类似,只是这里是一个反向指标。

  • 阈值。比如,在10秒内出现100次“调用成功”并且耗时都小于1秒。

  • 百分比。比如,在10秒内有95%请求“调用成功”并且98%的请求小于1秒。

同样包含「时间窗口」、「阈值」以及「百分比」。

稍微不同的地方在于,大多数情况下,一个系统“不可用”的状态往往会持续一段时间,不会那么快就恢复过来。所以我们不需要像第一步中识别“不可用”那样,无时无刻的记录请求状况,而只需要在每隔一段时间之后去进行探测即可。所以,这里多了一个「间隔时间」的概念。这个间隔幅度可以是固定的,比如30秒。也可以是动态增加的,通过线性增长或者指数增长等方式。

这个用代码表述大致是这样。

全局变量 successCount = 0; //有个独立的线程每隔10秒(时间窗口)重置为0。 //并且将下面的isHalfOpen设为false。 全局变量 isHalfOpen = true; //有个独立的线程每隔30秒(间隔时间)重置为true。 //do some thing... if(success){ if(isHalfOpen){ successCount ++; if(successCount = 可用阈值){ isOpenCircuitBreaker = false; } } return success; } else{ errorcount++; if(errorcount == 不可用阈值){ isOpenCircuitBreaker = true; } }

另外,尝试探测本质上是一个“试错”,要控制下“试错成本”。所以我们不可能拿100%的流量去验证,一般会有以下两种方式:

  1. 放行一定比例的流量去验证。

  2. 如果在整个通信框架都是统一的情况下,还可以统一给每个系统增加一个专门用于验证程序健康状态检测的独立接口。这个接口额外可以多返回一些系统负载信息用于判断健康状态,如CPU、I/O的情况等。

重新恢复正常

一旦通过了衡量是否“可用”的验证,整个系统就恢复到了“正常”状态,此时需要重新开启识别“不可用”的策略。就这样,系统会形成一个循环。

▲点击图片可查看大图

这就是一个完整的熔断机制的面貌。了解了这些核心思想,用什么框架去实施就变得不是那么重要了,因为大部分都是换汤不换药。

上面聊到的这些可以说是主干部分,还有一些最佳实践可以让你在实施熔断的时候拿捏的更到位。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 5:09:29

数据库架构演进——从“单间出租“到“合租公寓“

数据库架构演进——从"单间出租"到"合租公寓" 你有没有住过城中村? 生活场景:城中村到小区的演变 城中村时代(单数据库) 你租了一个单间: 厨房是公用的 卫生间是公用的 洗衣机是公用的 高峰期要排队 单数据库就像城中村:所有数据挤在一起,高并发…

作者头像 李华
网站建设 2026/7/2 5:06:55

通达信竣宝底部大阳启动量化选股与量化交易指标 大阳不破波浪掘金抓牛股主副图指标 平台突破指标公式

通达信竣宝底部大阳启动量化选股与量化交易指标 大阳不破波浪掘金抓牛股主副图指标 平台突破指标公式 整套指标完全适配通达信PC端与手机端,导入就能直接上手,没有任何复杂的调试门槛。不同于普通单一指标只看单日涨跌,这套组合体系采用“三…

作者头像 李华
网站建设 2026/7/2 5:04:07

内存是计算机的主存储器。内存为进程开辟出进程空间,让进程在其中保存数据。我将从内存的物理特性出发,深入到内存管理的细节,特别是了解虚拟内存和内存分页的概念。

简单地说,内存就是一个数据货架。内存有一个最小的存储单位,大多数都是一个字节。内存用内存地址(memory address)来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址从0开始,每…

作者头像 李华
网站建设 2026/7/2 5:03:57

上门维修电脑的坑,消委会已经发出警示!这几点一定要注意

电脑坏了,手机点一点,就有师傅上门来修。这两年,上门维修电脑的服务确实火了起来,不用出门、不用搬电脑,听着特别省心。但我今天想说的是,方便归方便,里面的坑可真不少。就在今年年初&#xff0…

作者头像 李华
网站建设 2026/7/2 4:59:26

git 将一个本地文件夹初始化成git仓库并且推送到远端git仓库

1.初始化本地git仓库 cd vscode-plugin-repo git init2.初始化远端git仓库 git remote add origin gitgithub.com:{username}/vscode-plugin.git查看远端仓库 git remote -v3.设置上游 先add和commit git add . git commit -m "初次提交"push到远端 git push --set-u…

作者头像 李华
网站建设 2026/7/2 4:59:03

饲料颗粒机哪家技术强

在饲料加工产业链中,颗粒机作为核心设备,其技术性能直接影响产品品质与生产成本。近期,我们围绕行业痛点与技术进化方向,对多家设备制造商的方案进行了持续跟踪。以下为基于实际使用数据与用户反馈的分析报告。行业痛点分析当前饲…

作者头像 李华