Sentinel源码阅读:滑动窗口实现原理

Sentinel限流实现原理

要实现限流、熔断等功能,首先要解决的是如何对资源的访问信息进行收集。例如将一个接口限制调用设置为1w/tps,那么我们如何知道当前接口的实时tps?

1.滑动窗口核心类图

Sentinel是采用滑动窗口来实时收集接口的调用信息,核心的类图结构如下:

https://note.youdao.com/yws/public/resource/d1b1e0285875883a0434ddb558408256/xmlnote/7DCCC867BA404E718BDD72FB85097B6D/9134

 

 

  • Metric

指标收集核心接口,主要定义一个滑动窗口中成功的数量、异常数量、阻塞数量,TPS、响应时间等数据。

  • LeapArray

滑动窗口顶层数据结构,包含一个一个的窗口数据。

  • ArrayMetric

滑动窗口核心实现类。

  • WindowWrap

每一个滑动窗口的包装类,其内部的数据结构用 MetricBucket 表示。

  • MetricBucket

指标桶,例如通过数量、阻塞数量、异常数量、成功数量、响应时间,已通过未来配额(抢占下一个滑动窗口的数量)。

  • MetricEvent

指标类型,例如通过数量、阻塞数量、异常数量、成功数量、响应时间等。

 

2.滑动窗口实现原理

2.1 ArrayMetric

是滑动窗口的入口类,他的主要核心方法有:

private final LeapArray<MetricBucket> data;//@1

public ArrayMetric(int sampleCount, int intervalInMs) {
    this.data = new OccupiableBucketLeapArray(sampleCount, intervalInMs);//@2
}

public ArrayMetric(int sampleCount, int intervalInMs, boolean enableOccupy) {//@3
    if (enableOccupy) {
        this.data = new OccupiableBucketLeapArray(sampleCount, intervalInMs);
    } else {
        this.data = new BucketLeapArray(sampleCount, intervalInMs);
    }
}

代码@1:是一个LeapArray属性值,存储滑动窗口的数据

代码@2、@3:提供了两个构造方法,核心参数主要有

  • sampleCount

在一个采集区间内采集的数据个数,比如在1000ms 内 sampleCount=2,那么这个区间滑动窗口个数为2个,每个滑动窗口时间范围是500ms。

  • intervalInMs

采集数据的时间间隔,比如1秒、1分钟。

  • enableOccupy

是否允许抢占,即当前时间戳已经达到限制后,是否可以占用下一个时间窗口的容量

ArrayMetric中唯一的属性是泛型参数为MetricBucket的LeapArray,MetricBucket是指标准的桶。

它的主要作用是Sentinel采集各种信息放入到MetricBucket中,例如一个时间窗口内请求的:通过数量、阻塞数量、 异常数量、成功数量、响应时间

 

2.2 MetricBucket

它的类图:

https://note.youdao.com/yws/public/resource/d1b1e0285875883a0434ddb558408256/xmlnote/4158A402858E4F4DA89E92DAD6A6D872/9231

主要代码分析:

private fi
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值