![实战Alibaba Sentinel:深度解析微服务高并发流量治理](https://wfqqreader-1252317822.image.myqcloud.com/cover/429/43738429/b_43738429.jpg)
4.1.1 Bucket
Sentinel使用Bucket统计一段时间内的各项指标数据,这些指标数据包括请求总数、成功总数、异常总数、总耗时、最小耗时等。一个Bucket可以记录1秒内的数据,也可以记录10毫秒内的数据,这由采样周期决定。采样周期就是每个Bucket的时间窗口大小。
在qps-helper中,Bucket的实现类为MetricBucket,只统计请求成功总数、请求异常总数、总耗时和最小耗时,代码如下。
![](https://epubservercos.yuewen.com/9A25A7/23020654801681306/epubprivate/OEBPS/Images/42670-00-75-1.jpg?sign=1739249725-YXocm7H2rXj8nsBRbP9r8v5TDYzWR8K5-0-9e114f83bbab41ca3c7389c8daf7f027)
• counters:存储各项指标的计数,包括请求异常总数、请求成功总数和总耗时等。
• minRt:只记录最小耗时。
MetricBucket使用LongAdder数组记录一段时间内的各项指标数据,LongAdder数组的每个元素分别记录请求成功总数、请求异常总数和总耗时,如图4.1所示。
![](https://epubservercos.yuewen.com/9A25A7/23020654801681306/epubprivate/OEBPS/Images/42670-00-76-1.jpg?sign=1739249725-NCtvNm2ILi4TsGkH9A9BAOiu9DWqozcl-0-f86c71ba9b006cb78fb76f89a5cc3557)
图4.1 LongAdder数组
提示:LongAdder数组保证了数据修改的原子性,并且性能比AtomicInteger更好。
Sentinel使用枚举类型MetricEvent的ordinal属性作为数组的下标,因为ordinal的值从0开始,按枚举元素的顺序递增,正好可以用作数组的下标。
在qps-helper中,MetricBucket的LongAdder数组已经替换成j.u.c包下的LongAdder类,并且MetricEvent只保留了EXCEPTION、SUCCESS和RT,代码如下。
![](https://epubservercos.yuewen.com/9A25A7/23020654801681306/epubprivate/OEBPS/Images/42670-00-76-2.jpg?sign=1739249725-5hhH3awDknxnMIPJ4VJsHnPHD5uJEuVF-0-d2a6fe730a8b52b6892c041b9ea188c5)
• EXCEPTION:请求异常总数指标,对应的数组下标为0。
• SUCCESS:请求成功总数指标,对应的数组下标为1。
• RT:总耗时指标,对应的数组下标为2。
当需要获取time-window(时间窗口)内所有Bucket统计请求成功总数、请求异常总数或总耗时时,可以根据MetricEvent从每个Bucket的LongAdder数组中获取对应的LongAdder实例,并调用sum方法计算总数,代码如下。
![](https://epubservercos.yuewen.com/9A25A7/23020654801681306/epubprivate/OEBPS/Images/42670-00-76-3.jpg?sign=1739249725-wYZN2TBRw2oIe4dJIvWUjS6dnvxB0Sph-0-82fd4aeb7b0d64a1f12e186b47aa3e6a)
当需要Bucket记录一个成功请求、一个异常请求或一个处理请求的耗时时,可以根据MetricEvent从Bucket的LongAdder数组中获取对应的LongAdder实例,并调用其add方法,代码如下。
![](https://epubservercos.yuewen.com/9A25A7/23020654801681306/epubprivate/OEBPS/Images/42670-00-77-1.jpg?sign=1739249725-ohLFUIxeIlBbMs68Q7e5eM811ueqzTsp-0-30266fa8e58a8f5e2dad8a65148df60f)