一文教你如何验证服务熔断功能

背景:

在业务服务中,我们引入了熔断功能来保障业务的高可用。比如登录接口里,会去调用其它服务,但是这个服务又不是必须的,不能因为服务有问题,例如平常是10ms响应,故障时间段变成设置的超时时间比如100ms,导致接口响应变差。虽然我们能容忍超时,但是不能接受一直持续着,这相当于会一直耗一个超时时间。所以熔断在这里解决的问题就是如果持续故障,就在一个时间周期内不再调用,过了周期再调用服务检查恢复没有。

那熔断的逻辑不难实现,各种编程语言也都有开源库实现。麻烦的是要验收这个功能是正常的,能达到预期的熔断效果,我们总不能上线功能等到故障发生再验收效果,万一没实现那岂不又是个bug,返工还不一定能确保没问题。

想模拟超时也不难,比如我可以把配置的超时改小就很容易超时了,但模拟不了超时恢复的效果。或者改代码概率性超时,但这已然不是之后发到线上的版本了,发布还要再改回来,不符合测试的标准。我们应该要在不改配置和代码的情况下,真实地模拟超时的发生和恢复。那怎样才能模拟到真实的场景,那就是程序发出去的网络包到回来这个时间段变长了或恢复正常了,跟程序无关。

模拟:

我们以ping baidu.com为例子,看实现的效果

从截图可以看出,开始网络包使用40ms+就可以完成来回,然后我们设置了延迟,增加了200ms的时延,之后再取消又恢复成40ms+。

那这里用到的模拟超时工具就是Linux的Tc(Traffic Control)工具。

tc 是 Linux 系统中的一个命令行工具,用于控制网络流量和队列。它可以帮助用户限制网络带宽、设置延迟、进行拥塞控制等操作,从而优化网络性能和提高用户体验。

tc 的原理比较简单,它主要是通过设置队列规则和调度算法来实现网络流量的控制。用户可以使用 tc 命令创建和修改队列规则,包括创建队列、设置带宽和延迟、定义过滤规则等等。然后,qdisc(队列调度器)将根据这些规则对网络数据包进行分类和处理,以确保网络流量的公平分配和合理利用。

我们先看使用的一组命令是什么,然后再分别介绍命令的作用

sql复制代码tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:10 htb rate 100Mbit
tc qdisc add dev eth0 parent 1:10 handle 10:1 netem delay 200ms

tc filter add dev eth0 parent 1: protocol ip u32 match ip dst 39.156.66.10 flowid 1:10
tc filter del dev eth0

网络包是程序调用系统的socket到内核态,分装成tcp/udp包,最后通过网卡发出去的。

那么Tc就是在网络包从网卡发出去前作用的,控制流量的调度、延迟等。

csharp复制代码tc qdisc add dev eth0 root handle 1: htb

在eth0网卡上添加一个HTB(Hierarchical Token Bucket)队列规则,使用ID(1:)标示,root表示这个是根规则,用于管理所有其他规则,默认会生成一个默认队列(图中名称root队列),流量调度为FIFO(先进先出),不做任何处理,直接将数据包发出去。

 
tc class add dev eth0 parent 1: classid 1:10 htb rate 100Mbit

这时候在eth0上创建了一个htb类型的分层队列,绑定到上层 【parent 1:】1:就是上个命令创建的ID,设置自己ID为 【classid 1:10】,【rate 100Mbit】指的是该class的最大带宽限制,即该class的带宽上限为100Mbps(兆比特每秒)。

100Mbps是指每秒钟可以传输的数据量,其单位为兆比特每秒(Mbps)。也就是说,如果网络中的所有设备都支持100Mbps的传输速率,那么在该网络中,每秒钟可以传输100兆比特的数据。这个数字通常用来表示网络的带宽大小。带宽越大,网络传输速度越快,可以支持更多的设备同时在线和更高的数据传输需求。在网络工程中,了解网络带宽是非常重要的,因为它可以帮助您更好地规划和管理网络资源。

这时候流量还是默认走root队列。因为在Linux的tc工具中,默认情况下,所有未匹配到的流量都会被发送到root队列中。

从图中可以看出,带宽的控制是通过生成了一个内存的令牌桶,平均生存速率为100Mbps(约等于1.49MB/s),该队列将被限制在100Mbps的速率下。此时,令牌桶算法会根据该速率来生成令牌,并根据令牌数来控制流量的发送速率。如果一个数据包的大小超过了令牌桶中可用的令牌数量(默认10KB,约等于0.01MB),那么该数据包将被缓存,并等待更多的令牌生成。这样可以保证数据包的发送速率不会超过设定的速率上限。

这时候还只是限制了带宽上限,100Mbps还不足以让我们出现丢包,还需要额外设置我们期望的超时时间。

那么看下一个命令,给包设置延迟时间

arduino复制代码tc qdisc add dev eth0 parent 1:10 handle 10:1 netem delay 200ms

通过qdisc来对队列进行管理,绑定到上层 【parent 1:10】1:10就是上个命令创建的classid,设置自己ID为 【10:1】设置netem模块来控制网络包的延迟时间,也可以设置丢包率。netem使用Linux内核中的红黑树结构来实现延迟队列,延迟时间最短的数据包会排在红黑树最前面,通过检查过期时间来决定是否将数据包发送出去。

我们的准备工作已经做的差不多了,只要数据包进来就会受到200ms延迟的影响。那最后一步就是匹配我们的目标流量,也就是案例中baidu.com对应的目标IP数据包。

sql复制代码tc filter add dev eth0 parent 1: protocol ip u32 match ip dst 39.156.66.10 flowid 1:10

通过filter设置目标IP匹配,绑定到根规则上 【parent 1:】,也就是说作用在第一层进行规则匹配,然后规则匹配的是IP协议,使用过滤器u32进行匹配,目标的IP为 39.156.66.10(这个IP是ping baidu.com开始时候拿到的IP,以实际拿到的为准),最后让匹配到的流量转发给cliassid为1:10的流量类别。

整个准备工作就完成了,此时观察网络包是否如预期设定的出现延迟即可。

最后测试完了也别忘了将配置给取消掉,免得环境一直出现延迟的问题。

python复制代码tc filter del dev eth0 ; 删除filter规则
tc class del dev eth0 classid 1:10 ;删除指定类别的
tc qdisc del dev eth0 root ;删除整个配置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作系统是计算机系统中的核心组成部分,负责管理和协调计算机硬件和软件资源,提供程序运行环境。在CSDN上有很多关于操作系统的专题文章,以下将从操作系统的基本概念、功能和常见类型等方面简要介绍一下。 首先是操作系统的基本概念。操作系统是一种系统软件,它是计算机硬件和应用软件之间的桥梁,提供给应用程序一系列的服务和资源,同时负责调度和管理系统资源。它为用户屏蔽了底层的硬件差异,提供了一个统一的、易于使用的界面。 操作系统主要有四个基本功能。首先是处理器管理,负责将处理器分配给系统中的各个进程,并进行进程切换,实现多道程序并发执行。其次是内存管理,管理计算机的内存资源,包括分配、回收和保护等操作。再次是文件管理,负责管理文件的存储、命名和保护等操作,提供了文件操作的接口。最后是设备管理,负责管理计算机的各种设备,包括输入输出设备和存储设备等。 常见的操作系统有多种类型。最主流的是Windows、Linux和Mac OS等桌面操作系统。此外还有服务器操作系统,如Windows Server和Linux等,用于管理和部署服务器。还有嵌入式操作系统,如Android和iOS等,用于移动设备和物联网设备。操作系统也有实时操作系统,用于需要实时控制和响应的系统,如工控系统和航空航天系统等。 总之,操作系统是计算机系统中不可或缺的重要组成部分,通过CSDN上的相关文章,我们可以更深入了解操作系统的基本概念、功能和不同类型。这些知识对于理解计算机系统的工作原理和提升编程能力都有着重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值