熔断器设计(二)

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)表示一个滑动窗口。TimeWindow 由一个 WindowsManager 管理,它有一个 map 对应请求的服务与 TimeWindow 的关系提供接口给外部调用。
整个熔断器在 CircuitBreaker 中做状态的转换,从请求开始的获取,还是到错误的转换,都在这里,
可自行观看。原理跟上一个熔断器差不多,只是这个使用了标准的滑动窗口,比较好看。

3、参考资料

https://github.com/stateIs0/Lu-Rpc.git

你可能感兴趣的:(熔断器设计(二))