温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Sentinel中怎么利用令牌桶实现预热

发布时间:2021-08-06 15:21:01 来源:亿速云 阅读:321 作者:Leah 栏目:编程语言

本篇文章为大家展示了Sentinel中怎么利用令牌桶实现预热,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

  

一、流控效果源码结构

在FlowRule更新缓存时,根据配置的不同类型初始化不同的流控效果处理类。 

1.流控效果封装入口
 

Sentinel中怎么利用令牌桶实现预热

2.分发不同的控制类
 

Sentinel中怎么利用令牌桶实现预热

3.流控控制类图
 

Sentinel中怎么利用令牌桶实现预热

二、快速失败

快速失败即发送流控时抛出FlowException。 

1.快速失败流程
 

Sentinel中怎么利用令牌桶实现预热

备注
@1 获取当前已经使用的线程数或者QPS
@2 与阈值进行判断,是否允许本次通行
@3 QPS流控并且prioritized设置为true表示预占用令牌
@4 大于阈值触发流控
@5 小于阈值允许通行

2.预占用令牌
 

预占用令牌:当基于QPS流控时并且prioritized设置为true,表示当前时间窗口令牌不够时,预占用下个时间窗口的令牌并返回需要等待的时间。

Sentinel中怎么利用令牌桶实现预热

备注:在不考虑优先级(预占用)令牌的情况,快速失败比较简单。

三、令牌桶原理

预热模式缓慢增加流量的一种方式,避免瞬间流量将系统压垮。
1.令牌桶图示
 

Sentinel中怎么利用令牌桶实现预热

工作过程

  • 请求流量从令牌桶中获取令牌,持有令牌放行,否则被拒

  • 假如设置阈值每秒允许100个请求通过,则请求发送速率r=100/s

  • 需要令牌生产速率为1/r,即1/100每10毫秒产生一个令牌

  • 令牌桶容量为b已满多余的令牌将被丢弃

  • 令牌桶为空请求被拒

  • 允许突发流量最大突发流量为令牌桶容量b

  • 请求通过相应的令牌从令牌桶中移除

2.令牌桶限流原理
 

假如系统平时流量很低,突然陡增的流量需要缓慢增加。具体到令牌桶,可以通过控制令牌的生产速率来对流量进行控制。令牌生产速率如何控制?

我们在使用sentinel设置QPS的预热流控时,需要设置阈值count和预热时长warmUpPeriodInSec,下面梳理下与下图坐标图的关系。

Sentinel中怎么利用令牌桶实现预热

坐标图说明

参数说明
x轴表示令牌桶中的令牌数量
y轴生产一个令牌需要的时间(秒)
stableInterval稳定生产一个令牌需要的时间
coldInterval生产一个令牌需要的最大时长,与冷启动因子coldFactor有关,可以通过-Dcsp.sentinel.flow.cold.factor设置,默认为3。
warmUpPeriodInSec预热时长,默认为10秒。对应到坐标图中为(2)梯形面积
thresholdPermits(warningToken)令牌桶中的一个阈值,超过该值时开启预热
maxPermits(maxToken)令牌桶中最大令牌数

换算关系

  • count,已知由用户设置,例如每秒允许通过100个请求

  • warmUpPeriodInSec,已知由用户设置,默认为10秒,时间区域上红色(2)梯形区域

  • coldFactor,已知默认为3

公式一:stableInterval = 1/count公式二:coldInterval = stableInterval * coldFactor

备注:由于coldFactor默认为3,y轴stableInterval~coldInterval的距离是0~stableInterval的距离两倍,时间区域上红色(2)梯形区域是红色1的长方形区域的两倍。

公式三:坐标时间(1)长方形区域面积 = 长(thresholdPermits(warningToken)) * 宽(stableInterval)公式四:坐标时间(1)长方形区域面积 = 0.5 * warmUpPeriodInSec公式五:thresholdPermits(warningToken)=0.5 * warmUpPeriodInSec/stableInterval

备注:梯形的面积 = (上低+下低)* 高 ➗ 2 推导出maxPermits(maxToken)的值。

公式六:maxPermits(maxToken) = thresholdPermits(warningToken) + 2 * warmUpPeriodInSec ➗ (stableInterval + coldInterval)

备注:由斜率公式k=(y1-y2)➗(x1-x2),得出斜率如下。

slope = (coldInterval-stableInterval)➗(maxPermits(maxToken)-thresholdPermits(warningToken))

原理概述

当令牌桶中的令牌数小于thresholdPermits(warningToken)时,令牌按照固定速率生产,请求流量稳定。当令牌数大于thresholdPermits(warningToken)时,开启预热。此段时期,生产的令牌的速率小于令牌滑落的速度,一段时间后,令牌小于等于thresholdPermits(warningToken),请求回归到稳定状态,预热结束。

四、预热源码分析

1.WarmUpController构造函数
 

Sentinel中怎么利用令牌桶实现预热

备注:此部分主要计算了warningToken阈值、最大令牌数maxToken、斜率slope,详细推导过程见原理部分。

2.请求判断逻辑
 

Sentinel中怎么利用令牌桶实现预热

3.令牌的生产和滑落
 

Sentinel中怎么利用令牌桶实现预热

Sentinel中怎么利用令牌桶实现预热

备注:从代码可以看出sentinel中桶中的令牌生产和移除是在下次请求到来时一起处理的,另外Sentinel提供的令牌生产公式与当前时间currentTime有关系,如果一个冷系统好久没有流量,瞬间来了很大流量,此时的桶中令牌数会直接到达最大值maxToken,这也是官方提供的曲线图中开始流量比较陡的原因。

Sentinel中怎么利用令牌桶实现预热

上述内容就是Sentinel中怎么利用令牌桶实现预热,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI