Sentinel系列文章
时间窗限流算法
1 | 复制代码如图 |
弊端
1 | 复制代码10t到16t 10个请求 |
滑动时间窗口
1 | 复制代码从黄线位置往前推一个时间窗口 |
1 | arduino复制代码这种情况有8个请求不能通过 |
1 | 复制代码分析点1和分析点2对应的2个时间窗有重叠的统计的部分 |
滑动时间窗口算法改进
1 | 复制代码如图每个时间窗100t、分成4段 每段25t 每一段对应一个统计数组元素 |
判断180t这点的请求是否可以通过
1 | 复制代码计算175t-180t之间的请求量 该时间窗对应a3 |
滑动时间窗口源码解析
- 对数据的统计
- 对统计数据的使用
分析这个方法
ArrayMetric
LeapArray
WindowWrap样本窗口实例 范型T为MetricBucket
1 | 复制代码windowLengthInMs 样本窗口长度 |
MetricBucket
MetricEvent数据统计的维度
1 | 复制代码统计这个时间窗口内 通过请求量、拦截请求量、异常请求量、成功请求量等6个维度的数据 放在LongAddr数组中 |
获取当前时间点所在的样本窗口
计算当前时间所在的样本窗口id
获取当前时间窗的开始时间
1 | ini复制代码1、首先计算27t位于哪个时间窗:27/10=2 |
替换掉老的时间窗口
1 | 复制代码对象本身没变 |
将当前窗口的请求数据添加到当前样本窗口的统计数据中
通过维度数据
对统计数据如何使用
流控快速失败
1 | 复制代码以前的加上现在的 |
获取之前统计好的数据
1 | python复制代码遍历数据将pass维度的数据取出来 求和 |
1 | sql复制代码将当前遍历的样本窗口统计数据记录到result中 |
过时判断
1 | 复制代码当前时间-窗口起始时间 比时间窗还大 那就是过时了 |
本文转载自: 掘金