赞
踩
在之前的学习中,我们已经学习完成了Sentinel源码的Node关系、责任链调用,那么这节课我们就要学习Sentinel核心源码中的一个非常重要的算法“滑动时间窗口算法”,也就是结构图中的WindowLeapArray,它为Sentinel提供当前时间的数据支撑, 如当前QPS,请求数,异常数等。
要学习滑动窗口,我们先要学习时间窗口算法,以循序渐进的方式了解滑动窗口,时间窗口算法也可以称之为:固定时间窗算法
概念:固定时间窗口计数器算法思想:在固定的时间窗口内,可以允许固定数量的请求进入。超过数量就拒绝或者排队,等下一个时间段进入。
那我们来看图分析:
具体分析一下:
存在问题:
16t到26t之间也是10t大小的一个时间窗,但跨了两个固定的时间窗,问题是请求总数为110,超过阈值,这种固定时间窗无法处理这部分超出的请求,所以解决办法就是使用滑动时间窗。
使用滑动时间窗的主要原因是虽然以上提到超出阈值的范围跨了两个时间窗,但是超过的请求书的范围是10t,且实际上我们要清楚,我们系统限流的目的是要在任意时间窗都要能应对突然的流量暴增,如果使用以上的算法,就会造成在16t和26t之间的请求无法限流,严重会导致服务雪崩。
要解决的话,我们就需要使用滑动时间窗算法,具体原理如下:
滑动时间窗限流算法解决了固定时间窗限流算法的问题。其没有划分固定的时间窗起点与终点,而是将每一次请求的到来时间点作为统计时间窗的终点,起点则是终点向前推时间窗长度的时间点。这种时间窗称为“滑动时间窗”
看图分析
此图中我们可以分析中,实际上当前的时间窗不再是固定的,而是可以从时间的起始位置一直向右滑动
这样的话就可以解决固定时间窗带来的问题,其原理就是:
存在问题
但是此时滑动时间窗还是有问题的,问题就是会出现大量的重复统计,造成系统效率下降,如下图所示:
在此图中我们就可以看出,这个蓝色的区域就是重复统计的区域,也就是说每一次移动时间窗口,都需要重新统计重复区域的请求数量,从而导致浪费大量的系统资源。
解决办法
想要解决以上的问题,我们就需要更加细粒度话的计算,增加多个子时间窗口:样本窗口
为了解决滑动时间窗算法因为每次滑动都需要重复统计滑动前的一部分数据的问题,这个问题很致命,特别是作为一个流控组件来说,不应该影响整体系统的效率。所以需要改进, 在改进方案中,引入了样本窗口来解决问题。
样本窗口概念:
原理图被限流的情况:
此时会被流控,因为因为样本窗口的请求数加起来再加上当前时间窗的10个请求数已经到阈值100了,所以新过来的请求就会被流控
原理图不被限流的情况:
此时这个请求将不会被限流,因为本次请求的时间的对应的样本窗口只有5个请求加上之前重复的样本窗口统计的流量值,没有超过阈值100,所以本次请求会通过。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。