1、前言
我们已知的滑动窗口可以用来作为 Tcp 的流量控制的,它每次只滑动小于窗口大小的距离,所以每个时间段的窗口会交叉,如图:
滑动窗口
当滑动窗口每次滑动一个窗口的距离时,每个窗口都是不交叉的,可以算是滚动窗口,每次向前滚动一个窗口的大小。上一篇熔断器的设计其实算滑动窗口每次向前滑动一个窗口的距离,只是它的窗口不明显,直接在变量将每个时间窗口的失败量跟请求量定在了一起。
Hystrix通过滑动窗口来对数据进行“平滑”统计,默认情况下,一个滑动窗口包含10个桶(Bucket),每个桶时间宽度是1秒,负责1秒的数据统计。
上图的每个小矩形代表一个桶,可以看到,每个桶都记录着1秒内的四个指标数据:成功量、失败量、超时量和拒绝量。10个桶合起来是一个完整的滑动窗口,所以计算一个滑动窗口的总数据需要将10个桶的数据加起来。
2、设计
其实可以参照 rpc 框架:https://github.com/stateIs0/Lu-Rpc.git。
这边实际上初始化一个 Metrics(被当作一个桶),桶里有请求总数(total)、请求异常总数(exception)、桶开始计时时间(startTime)。Metrics(桶)被一个 TimeWindow 所管理,每个 TimeWindow 持有一个 Metrics 数组(AtomicReferenceArray<Metrics>)表示一个滑动窗口。TimeWindow 由一个 WindowsManager 管理,它有一个 map 对应请求的服务与 TimeWindow 的关系提供接口给外部调用。
整个熔断器在 CircuitBreaker 中做状态的转换,从请求开始的获取,还是到错误的转换,都在这里,
可自行观看。原理跟上一个熔断器差不多,只是这个使用了标准的滑动窗口,比较好看。
网友评论