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

在这个示例程序的代码中 , eventStream流通过interval操作符每100毫秒发送一个随机值(0或1) , 随机值为0代表失败 , 为1代表成功 , 模拟HystrixCommand的事件发送机制 。
桶计数流bucketedCounterStream使用window操作符以300毫秒为一个时间桶窗口 , 将原始的事件流进行拆分 , 每个时间桶窗口的3事件聚合起来 , 输出一个新的Observable(子流) 。 然后 , bucketedCounterStream通过flapMap操作将每一个Observable进行扁平化 。
桶计数流bucketedCounterStream的处理过程如图5-15所示 。
有空就来学Hystrix RPC保护的原理,RPC监控之滑动窗口的实现原理
本文插图
图5-15 模拟的桶计数流bucketedCounterStream的处理过程
bucketedCounterStream的flapMap扁平化操作是通过调用reduceBucketToSummary方法完成的 , 该方法首先将每一个时间桶窗口内的Observable子流内的元素序列转成一个列表(List) , 然后进行过滤(留下值为0事件)和统计 , 返回值为0的元素统计数量(失败数) 。
接下来 , 需要对bucketedCounterStream桶计数进行汇总统计 , 形成滑动窗口的统计数据 , 这个工作由bucketedRollingCounterStream桶滑动统计流完成 。
桶滑动统计流仍然使用window和flatMap两个操作符 , 先在输入流中通过window操作符按照步长为1、长度为3的规则划分滑动窗口 , 每个滑动窗口的3统计数据被聚集起来 , 输出一个新的Observable 。 然后通过flatMap扁平化操作符对每一个Observable进行聚合 , 计算出各元素的累加值 。
模拟的桶滑动统计流bucketedRollingCounterStream的处理过程如图5-16所示 。
有空就来学Hystrix RPC保护的原理,RPC监控之滑动窗口的实现原理
本文插图
图5-16 桶滑动统计流bucketedRollingCounterStream的处理过程
bucketedRollingCounterStream的flapMap扁平化操作是通过调用reduceWindowToSummary方法完成的 , 该方法通过RxJava的reduce操作符进行“聚合”操作 , 将Observable子流中的3事件的累加结果计算出来 。
在Hystrix中 , 业务逻辑以命令模式封装成了一个个命令(HystrixCommand) , 每个命令执行完成后都会发送命令完成事件(HystrixCommandCompletion)到HystrixCommandCompletion Stream命令完成事件流 。 HystrixCommandCompletion是Hystrix中核心的事件 , 它可以代表某个命令执行成功、超时、异常等各种状态 , 与Hystrix熔断器的状态转换息息相关 。
桶计数流BucketedCounterStream是一个抽象类 , 提供了基本的桶计数器实现 。 用户在使用Hystrix的时候一般都要配置两个值:timeInMilliseconds(滑动窗口的长度 , 时间间隔)和numBuckets(滑动窗口中的桶数) , 每个桶对应的时间长度就是bucketSizeInMs=timeInMilliseconds/numBuckets , 该时间长度可以记为一个时间桶窗口BucketedCounterStream每隔一个时间桶窗口就把这段时间内的所有调用事件聚合到一个累积桶内 。 下面来看一下它的实现 。