有空就来学Hystrix RPC保护的原理,RPC监控之滑动窗口的实现原理


Hystrix通过滑动窗口的数据结构来统计调用的指标数据 , 并且大量使用了RxJava响应式编程操作符 。 滑动窗口的本质就是不断变换的数据流 , 因此滑动窗口的实现非常适合使用观察者模式以及响应式编程模式去完成 。 最终 , RxJava便成了Hystrix滑动窗口实现的框架选择 。 Hystrix滑动窗口的核心实现是使用RxJava的window操作符(算子)来完成的 。 使用RxJava实现滑动窗口还有一大好处就是可以依赖RxJava的线程模型来保证数据写入和聚合的线程安全 。
Hystrix滑动窗口的原理和实现逻辑非常复杂 , 所以在深入学习之前先看一个Hystrix滑动窗口模拟实现示例 。
下面总体介绍一下Hystrix健康统计滑动窗口的执行流程 。
首先 , HystrixCommand命令器的执行结果(失败、成功)会以事件的形式通过RxJava事件流弹射出去 , 形成命令完成事件流 。
然后 , 桶计数流以事件流作为来源 , 将事件流中的事件按照固定时间长度(桶时间间隔)划分成滚动窗口 , 并对时间桶滚动窗口内的事件按照类型进行累积 , 完成之后将桶数据弹射出去 , 形成桶计数流 。
最后 , 桶滑动统计流以桶计数流作为来源 , 按照步长为1、长度为设定的桶数(配置的滑动窗口桶数)的规则划分滑动窗口 , 并对滑动窗口内的所有桶数据按照各事件类型进行汇总 , 汇总成最终的窗口健康数据 , 并将其弹射出去 , 形成最终的桶滑动统计流 , 作为Hystrix熔断器进行状态转换的数据支撑 。
以上介绍的Hystrix健康统计滑动窗口的执行流程如图5-13所示 。
有空就来学Hystrix RPC保护的原理,RPC监控之滑动窗口的实现原理
本文插图
图5-13 Hystrix健康统计滑动窗口的执行流程
为了帮助大家学习Hystrix滑动窗口的执行流程 , 这里设计一个简单的Hystrix滑动窗口模拟实现用例 , 对Hystrix滑动窗口数据流的处理过程进行简化 , 只留下核心部分 , 简化的模拟执行流程如下:
首先 , 模拟HystrixCommand的事件发送机制 , 每100毫秒发送一个随机值(0或1) , 随机值为0代表失败 , 为1代表成功 , 模拟命令完成事件流 。
其次 , 模拟HystrixCommand的桶计数流 , 以事件流作为来源 , 将事件流中的事件按照固定时间长度(300毫秒)划分成时间桶滚动窗口 , 并对时间桶滚动窗口内值为0的事件进行累积 , 完成之后将累积数据弹射出去 , 形成桶计数流 。
最后 , 模拟桶计数流作为来源 , 按照步长为1、长度为设定的桶数
(3)的规则划分滑动窗口 , 并对滑动窗口内的所有桶数据进行汇总 , 汇总成最终的失败统计数据 , 并将其弹射出去 , 形成最终的桶滑动统计流 。
以上模拟Hystrix健康统计滑动窗口的执行流程如图5-14所示 。