当前位置:网站首页>Sentinel 三种流控效果
Sentinel 三种流控效果
2022-07-24 10:24:00 【流楚丶格念】
流控效果
我们先来回顾一下流控模式有哪些:
| 流控模式 | 说明 |
|---|---|
| 直接 | 统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式 |
| 关联 | 统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流 |
| 链路 | 统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流 |
三种流控模式我们都可以在流控选项中进行设置。
此外,在流控的高级选项中,还有一个流控效果选项,例如下图所示:

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
| 流控效果 | 说明 |
|---|---|
| 快速失败 | 达到阈值后,新的请求会被立即拒绝并抛出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 | 预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。 |
| 排队等待 | 让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长 |
边栏推荐
- [STM32 learning] (10) stm32f1 general timer realizes pulse counter
- 2022, will lead the implementation of operation and maintenance priority strategy
- 【二叉树先导】树的概念和表示方法
- 2022, enterprise unified process platform design and integration specifications refer to thubierv0.1
- Domain Driven practice summary (basic theory summary and analysis + Architecture Analysis and code design + specific application design analysis V) [easy to understand]
- Review of new services and functions of Amazon cloud technology in June 2022
- String__
- Kotlin advanced
- 【LeeCode】获取2个字符串的最长公共子串
- PostgreSQL rounding
猜你喜欢

New:Bryntum Grid 5.1.0 Crack

Constant pointer, pointer constant
![[STM32 learning] (11) STM32 Mifare_ Use of one (S50) m1s50 (read, write, key modification, control bit interpretation)](/img/fd/4290525914b5146fe0eb653517fef9.png)
[STM32 learning] (11) STM32 Mifare_ Use of one (S50) m1s50 (read, write, key modification, control bit interpretation)

Will not be rejected! Learn the distributed architecture notes sorted out by Alibaba Daniel in 35 days, with a salary increase of 20K

zoj-Swordfish-2022-5-6

Mysql database JDBC programming

Figure model 2-2022-5-13

Dynamic programming -- a collection of stock problems

String__

Segment tree--
随机推荐
zoj 2770 差分约束系统---2--2022年5月20日
MySQL - lock
【LeeCode】获取2个字符串的最长公共子串
The role of glpushmatrix and glpopmatrix
Web Security Foundation - file upload (file upload bypass)
Golang migrate is easy to use
Homologous policy solutions
Build a live broadcast platform based on webrtc
Create a vertical seekbar from scratch
差分约束系统---1且2--2022年5月27日
ES6 question
Application of for loop
A ten thousand word blog post takes you into the pit. Reptiles are a dead end [ten thousand word pictures]
NiO knowledge points
Jenkins deploys the project and prompts that the module package defined by him cannot be found
【二叉树先导】树的概念和表示方法
[STM32 learning] (8) stm32f1 general timer configuration
Trie tree template 2
Tree array-
多表查询之子查询_单行单列情况