Sentinel源码分析----滑动窗口

Sentinel使用滑动窗口统计数据,包括1秒和1分钟窗口,由ArrayMetric和WindowWrap实现。每个窗口由小窗口组成,如1秒窗口包含2个500ms窗口,1分钟窗口包含60个1000ms窗口。滑动窗口通过计算当前时间的下标和开始时间确定,过期窗口会进行重置。在获取统计数据时,Sentinel能有效过滤掉上一周期的数据,确保统计准确。
摘要由CSDN通过智能技术生成

之前说过Sentinel内部统计使用Node来进行处理,而Node底层是使用滑动窗口实现的,这篇文章主要分析一下滑动窗口的实现。

StatisticNode#addPassRequest方法为入口,先看看内部实现:

    private transient volatile Metric rollingCounterInSecond = new ArrayMetric(SampleCountProperty.SAMPLE_COUNT,
        IntervalProperty.INTERVAL);

    private transient Metric rollingCounterInMinute = new ArrayMetric(60, 60 * 1000);
    @Override
    public void addPassRequest(int count) {
   
        rollingCounterInSecond.addPass(count);
        rollingCounterInMinute.addPass(count);
    }

addPassRequest方法内部调用了rollingCounterInSecond.addPassrollingCounterInMinute.addPass,看了下两个变量的声明,可以看到类型都是ArrayMetric,只不过参数不一样,而从变量名来看,一个是统计一分钟的数据,一个是统计一秒钟的数据
那么看看ArrayMetric是什么东西,构造方法和成员变量如下

    private final MetricsLeapArray data;

    public ArrayMetric(int sampleCount, int intervalInMs) {
   
        this.data = new MetricsLeapArray(sampleCount, intervalInMs);
    }

内部只有一个MetricsLeapArray类型,似乎又将统计的任务委托给了MetricsLeapArray,抽两个方法看看其实现:

    public void addPass(int count) {
   
        // 获取当前窗口
        WindowWrap<MetricBucket> wrap = data.currentWindow();
        // 将数据统计在当前窗口中
        wrap.value().addPass(count);
    }
    public long pass() {
   
        data.currentWindow();
        long pass = 0;
        // 获取所有窗口
        List<MetricBucket> list = data.values();
        // 所有窗口的值累加返回
        for (MetricBucket window : list) {
   
            pass += window.pass();
        }
        return pass;
    }

的确是核心实现是在MetricsLeapArray中,这里只做一层转发、汇总

接着继续看下MetricsLeapArray实现

public class MetricsLeapArray extends LeapArray<MetricBucket> {
   

    public MetricsLeapArray(int sampleCount, int intervalInMs) {
   
        super(sampleCount, intervalInMs);
    }

    @Override
    public MetricBucket newEmptyBucket() {
   
        return new MetricBucket();
    }

    @Override
    protected WindowWrap<MetricBucket> resetWindowTo(WindowWrap<MetricBucket> w, long startTime) {
   
        // Update the start time and reset value.
        w.resetTo(startTime);
        w.value().reset();
        return w;
    }
}

MetricsLeapArray貌似也只是重写了部分方法,核

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值