springcloud -- sentinel 滑动时间窗口计数

针对固定时间算法会在临界点存在瞬间大流量冲击的场景,滑动时间窗口计数器算法应运而生。它将时间窗口划分为更小的时间片段,每过一个时间片段,我们的时间窗口就会往右滑动一格,每个时间片段都有独立的计数器

sentinel的滑动窗口统计机制就是根据当前时间,获取对应的时间窗口,并更新该时间窗口中的各项统计指标(pass/block/rt等),
这些指标被用来进行后续判断,比如限流、降级等;随着时间的推移,当前时间点对应的时间窗口是变化的,这时会涉及到时间窗口的初始化、复用等。
可以说,sentinel上的功能所用到的数据几乎都是滑动窗口统计机制来维护和更新的。

  

滑动窗口可以先拆为滑动跟窗口两个词,先介绍下窗口,你可以这么理解,一段是时间就是窗口,比如说我们可以把这个1s认为是1个窗口。
这个样子我们就能将1分钟就可以划分成60个窗口了,这个没毛病吧。如下图我们就分成了60个窗口

 比如现在处于第1秒上,那1s那个窗口就是当前窗口,就如下图中红框表示。

 现在在来看下滑动,滑动很简单,比如说现在时间由第1秒变成了第2秒,就是从当前这个窗口---->下一个窗口就可以了,

这个时候下一个窗口就变成了当前窗口,之前那个当前窗口就变成了上一个窗口,这个过程其实就是滑动。

滑动时间窗口

以bucket (小的时间窗口)来统计,默认值=500ms

 用数组可以避免频繁的gc。足够单一,并且是单节点,保证修改的原子特性

 bucket数组:默认120个,可复用,记录每个小数组发生的所有事件,根据下标定位数组

定位小数组:拿到时间戳去掉毫秒 % 数组长度 



原文地址:https://www.cnblogs.com/alomsc/p/15147736.html