4.1.1 Bucket
Sentinel使用Bucket统计一段时间内的各项指标数据,这些指标数据包括请求总数、成功总数、异常总数、总耗时、最小耗时等。一个Bucket可以记录1秒内的数据,也可以记录10毫秒内的数据,这由采样周期决定。采样周期就是每个Bucket的时间窗口大小。
在qps-helper中,Bucket的实现类为MetricBucket,只统计请求成功总数、请求异常总数、总耗时和最小耗时,代码如下。
• counters:存储各项指标的计数,包括请求异常总数、请求成功总数和总耗时等。
• minRt:只记录最小耗时。
MetricBucket使用LongAdder数组记录一段时间内的各项指标数据,LongAdder数组的每个元素分别记录请求成功总数、请求异常总数和总耗时,如图4.1所示。
图4.1 LongAdder数组
提示:LongAdder数组保证了数据修改的原子性,并且性能比AtomicInteger更好。
Sentinel使用枚举类型MetricEvent的ordinal属性作为数组的下标,因为ordinal的值从0开始,按枚举元素的顺序递增,正好可以用作数组的下标。
在qps-helper中,MetricBucket的LongAdder数组已经替换成j.u.c包下的LongAdder类,并且MetricEvent只保留了EXCEPTION、SUCCESS和RT,代码如下。
• EXCEPTION:请求异常总数指标,对应的数组下标为0。
• SUCCESS:请求成功总数指标,对应的数组下标为1。
• RT:总耗时指标,对应的数组下标为2。
当需要获取time-window(时间窗口)内所有Bucket统计请求成功总数、请求异常总数或总耗时时,可以根据MetricEvent从每个Bucket的LongAdder数组中获取对应的LongAdder实例,并调用sum方法计算总数,代码如下。
当需要Bucket记录一个成功请求、一个异常请求或一个处理请求的耗时时,可以根据MetricEvent从Bucket的LongAdder数组中获取对应的LongAdder实例,并调用其add方法,代码如下。