前言
算法
Sentinel的QPS流控效果有快速失败、预热模式、排队等待、预热+排队等待模式,本文主要分析预热模式中是如何使用令牌桶算法限流的。 swift
1、流控效果源码结构缓存
在FlowRule更新缓存时,根据配置的不一样类型初始化不一样的流控效果处理类。 微信
2、快速失败app
快速失败即发送流控时抛出FlowException。 编辑器
备注
@1 获取当前已经使用的线程数或者QPS
@2 与阈值进行判断,是否容许本次通行
@3 QPS流控而且prioritized设置为true表示预占用令牌
@4 大于阈值触发流控
@5 小于阈值容许通行函数
预占用令牌:当基于QPS流控时而且prioritized设置为true,表示当前时间窗口令牌不够时,预占用下个时间窗口的令牌并返回须要等待的时间。源码分析
备注:在不考虑优先级(预占用)令牌的状况,快速失败比较简单。学习
3、令牌桶原理ui
工做过程
请求流量从令牌桶中获取令牌,持有令牌放行,不然被拒
假如设置阈值每秒容许100个请求经过,则请求发送速率r=100/s
须要令牌生产速率为1/r,即1/100每10毫秒产生一个令牌
令牌桶容量为b已满多余的令牌将被丢弃
令牌桶为空请求被拒
容许突发流量最大突发流量为令牌桶容量b
请求经过相应的令牌从令牌桶中移除
假如系统平时流量很低,忽然陡增的流量须要缓慢增长。具体到令牌桶,能够经过控制令牌的生产速率来对流量进行控制。令牌生产速率如何控制?
咱们在使用sentinel设置QPS的预热流控时,须要设置阈值count和预热时长warmUpPeriodInSec,下面梳理下与下图坐标图的关系。
坐标图说明
参数 | 说明 |
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),请求回归到稳定状态,预热结束。
4、预热源码分析
备注:此部分主要计算了warningToken阈值、最大令牌数maxToken、斜率slope,详细推导过程见原理部分。
备注:从代码能够看出sentinel中桶中的令牌生产和移除是在下次请求到来时一块儿处理的,另外Sentinel提供的令牌生产公式与当前时间currentTime有关系,若是一个冷系统很久没有流量,瞬间来了很大流量,此时的桶中令牌数会直接到达最大值maxToken,这也是官方提供的曲线图中开始流量比较陡的缘由。
做者丨梁勇
来源丨瓜农老梁
欢迎关注公众号「瓜农老梁」
本文分享自微信公众号 - 瓜农老梁(gh_01130ae30a83)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。