源码分析 Alibaba sentinel 滑动窗口实现原理(文末附原理图)
中间件兴趣圈 人气:2
要实现限流、熔断等功能,首先要解决的问题是如何实时采集服务(资源)调用信息。例如将某一个接口设置的限流阔值 1W/tps,那首先如何判断当前的 TPS 是多少?Alibaba Sentinel 采用滑动窗口来实现实时数据的统计。
> 温馨提示:如果对源码不太感兴趣,可以先跳到文末,看一下滑动窗口的设计原理图,再决定是否需要阅读源码。
@[TOC](本节目录)
## 1、滑动窗口核心类图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191229144055643.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByZXN0aWdlZGluZw==,size_16,color_FFFFFF,t_70)
我们先对上述核心类做一个简单的介绍,重点关注核心类的作用与核心属性(重点需要探究其核心数据结构)。
- Metric
指标收集核心接口,主要定义一个滑动窗口中成功的数量、异常数量、阻塞数量,TPS、响应时间等数据。
- ArrayMetric
滑动窗口核心实现类。
- LeapArray
滑动窗口顶层数据结构,包含一个一个的窗口数据。
- WindowWrap
每一个滑动窗口的包装类,其内部的数据结构用 MetricBucket 表示。
- MetricBucket
指标桶,例如通过数量、阻塞数量、异常数量、成功数量、响应时间,已通过未来配额(抢占下一个滑动窗口的数量)。
- MetricEvent
指标类型,例如通过数量、阻塞数量、异常数量、成功数量、响应时间等。
## 2、滑动窗口实现原理
#### 2.1 ArrayMetric
滑动窗口的入口类为 ArrayMetric ,我们先来看一下其核心代码。
~~~java
private final LeapArray
加载全部内容