Sentinel 三种流控效果
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sentinel 三种流控效果相关的知识,希望对你有一定的参考价值。
文章目录
流控效果
我们先来回顾一下流控模式有哪些:
流控模式 | 说明 |
---|---|
直接 | 统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式 |
关联 | 统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流 |
链路 | 统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流 |
三种流控模式我们都可以在流控选项中进行设置。
此外,在流控的高级选项中,还有一个流控效果选项,例如下图所示:
流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
流控效果 | 说明 |
---|---|
快速失败 | 达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。 |
warm up | 预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。 |
排队等待 | 让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长 |
下面我们再来详细了解下各个流控效果是怎样的,注意:下面几种流控效果的流控模式都是默认的直接模式,我们只探究流控效果。
1.快速失败
快速失败是默认的处理方式,当请求达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。
例如我们设置阈值为一秒一个请求,当我们请求QPS超过阈值时候,在浏览器中会直接报错:
浏览器中打印报错:
2.warm up
阈值一般是一个微服务能承担的最大QPS,但是一个服务刚刚启动时,一切资源尚未初始化(冷启动),如果直接将QPS跑到最大值,可能导致服务瞬间宕机。
warm up也叫预热模式,是应对服务冷启动的一种方案。请求阈值初始值是 maxThreshold / coldFactor,持续指定时长后,逐渐提高到maxThreshold值。而coldFactor的默认值是3.
例如,我设置QPS的maxThreshold为10,预热时间为5秒,那么初始阈值就是 10 / 3 ,也就是3,然后在5秒后逐渐增长到10.
案例
需求:给/order/orderId这个资源设置限流,最大QPS为10,利用warm up效果,预热时长为5秒
1)配置流控规则:
2)Jmeter测试
QPS为10.
刚刚启动时,大部分请求失败,成功的只有3个,说明QPS被限定在3:
随着时间推移,成功比例越来越高:
到Sentinel控制台查看实时监控:
一开始:
预热一段时间后:
我们从过程中也可以看到,Wamp up效果的阈值增长是主键递增的
3.排队等待
当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。
排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。
例如:QPS = 5,意味着每200ms处理一个队列中的请求;timeout = 2000,意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。
那什么叫做预期等待时长呢?
例如:现在一下子来了12 个请求,因为每200ms执行一个请求,那么:
- 第6个请求的预期等待时长 = 200 * (6 - 1) = 1000ms
- 第12个请求的预期等待时长 = 200 * (12-1) = 2200ms
现在,第1秒同时接收到10个请求,但第2秒只有1个请求,此时QPS的曲线这样的:
如果使用队列模式做流控,所有进入的请求都要排队,以固定的200ms的间隔执行,QPS会变的很平滑:
这样平滑的QPS曲线,对于服务器来说是更友好的。
那么下面我们来操作一下:
案例
需求:给/order/orderId这个资源设置限流,最大QPS为10,利用排队的流控效果,超时时长设置为5s
1)添加流控规则
2)Jmeter测试
QPS为15,已经超过了我们设定的10。
如果是之前的 快速失败、warmup模式,超出的请求应该会直接报错。
但是我们看看队列模式的运行结果:
全部都通过了。
再去sentinel查看实时监控的QPS曲线:
QPS非常平滑,一致保持在10,但是超出的请求没有被拒绝,而是放入队列。因此响应时间(等待时间)会越来越长。
当队列满了以后,才会有部分请求失败:
.总结
流控效果有哪些?
流控效果 | 说明 |
---|---|
快速失败 | 达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。 |
warm up | 预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。 |
排队等待 | 让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长 |
以上是关于Sentinel 三种流控效果的主要内容,如果未能解决你的问题,请参考以下文章