读者福利
更多笔记分享
在一个采集间隔中抽样的个数,默认为 2,例如当 intervalInMs = 1000时,抽象两次,则一个采集间隔中会包含两个相等的区间,一个区间就是滑动窗口。
- boolean enableOccupy
是否允许抢占,即当前时间戳已经达到限制后,是否可以占用下一个时间窗口的容量,这里对应 LeapArray 的两个实现类,如果允许抢占,则为 OccupiableBucketLeapArray,否则为 BucketLeapArray。
注意,LeapArray 的泛型类为 MetricBucket,意思就是指标桶,可以认为一个 MetricBucket 对象可以存储一个抽样时间段内所有的指标,例如一个抽象时间段中通过数量、阻塞数量、异常数量、成功数量、响应时间,其实现的奥秘在 LongAdder 中,本文先不对该类进行详细介绍,后续文章会单独来探究其实现原理。
这次,我们先不去看子类,反其道而行,先去看看其父类。
2.2 LongAdder
2.2.1 类图与核心属性
LeapArray 的核心属性如下:
- int windowLengthInMs
每一个窗口的时间间隔,单位为毫秒。
- int sampleCount
抽样个数,就一个统计时间间隔中包含的滑动窗口个数,在 intervalInMs 相同的情况下,sampleCount 越多,抽样的统计数据就越精确,相应的需要的内存也越多。
- int intervalInMs
一个统计的时间间隔。
- AtomicReferenceArray<WindowWrap< T>> array
一个统计时间间隔中滑动窗口的数组,从这里也可以看出,一个滑动窗口就是使用的 WindowWrap< MetricBucket > 来表示。
上面的各个属性的含义是从其构造函数得出来的,请其看构造函数。
public LeapArray(int sampleCount, int intervalInMs) {
AssertUtil.isTrue(sampleCount > 0, "bucket count is invalid: " + sampleCount);
Assert