本文主要是介绍Guava RateLimiter预热模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Guava RateLimiter预热模型
什么是流量预热
我们都知道在做运动之前先得来几组拉伸之类的动作,给身体做个热身,让我们的身体平滑过渡到后面的剧烈运动中。流量预热也是一样的道理,对限流组件来说,流量预热就类似于一种热身运动,它可以动态调整令牌发放速度,让流量变化更加平滑。
我们来举一个例子:某个接口设定了100个Request每秒的限流标准,同时使用令牌桶算法做限流。假如当前时间窗口内都没有Request过来,那么令牌桶中会装满100个令牌。如果在下一秒突然涌入100个请求,这些请求会迅速消耗令牌,对服务的瞬时冲击会比较大。因此我们需要一种类似“热身运动”的缓冲机制,根据桶内的令牌数量动态控制令牌的发放速率,让忙时流量和闲时流量可以互相平滑过渡。
流量预热的做法
我们以Guava中的RateLimiter为例,看看流量预热在RateLimiter中是如何运作的,我们用下面的状态转换图来展示整个过程:
横坐标是令牌桶的当前容量,纵坐标是令牌发放速率,我们先从横坐标来分析
横坐标
下面两种场景会导致横坐标的变化:
- 闲时流量 流量较小或者压根没流量的时候,横坐标会逐渐向右移动,表示令牌桶中令牌数量增多
- 忙时流量 当访问流量增大的时候,横坐标向左移动,令牌桶中令牌数量变少
横轴有两个重要的坐标,一个是最右侧的“令牌桶最大容量”,这个不难理解。还有一个是Half容量,它是一个关键节点,会影响令牌发放速率。
纵坐标
纵坐标表示令牌的发放速率,这里有3个标线,分别是稳定时间间隔,2倍间隔,3倍间隔。
这里间隔的意思就是隔多长时间发放一个令牌,而所谓稳定间隔就是一个基准时间间隔。假如我们设置了每秒10个令牌的限流规则,那么稳定间隔也就是1s/10=0.1秒,也就是说每隔0.1秒发一个令牌。相应的,3倍间隔的数值是用稳定间隔乘以系数3,比如上面这个例子中3倍间隔就是0.3秒。
运作模式
了解了横坐标和纵坐标的含义之后,让我们来试着理解预热模型的用例。继续沿用上面10r/s的限流设置,稳定间隔=0.1s,3x间隔是0.3s。
我们先考虑闲时到忙时的流量转变,假定当前我们处于闲时流量阶段,没几个访问请求,这时令牌桶是满的。接着在下一秒突然涌入了10个请求,这些请求开始消耗令牌桶中的令牌。在初始阶段,令牌的放行速度比较慢,在第一个令牌被消耗以后,后面的请求要经过3x时间间隔也就是0.3s才会获取第二块令牌。随着令牌桶中令牌数量被逐渐消耗,当令牌存量下降到最大容量一半的时候(Half位置),令牌放行的速率也会提升,以稳定间隔0.1s发放令牌。
反过来也一样,在流量从忙时转变为闲时的过程中,令牌发放速率是由快到慢逐渐变化。起始阶段的令牌放行间隔是0.1s,随着令牌桶内令牌逐渐增多,当令牌的存量积累到最大容量的一半后,放行令牌的时间间隔进一步增大为0.3s。
RateLimiter正是通过这种方式来控制令牌发放的时间间隔,从而使流量的变化更加平滑。
这篇关于Guava RateLimiter预热模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!