有空就来学Hystrix RPC保护的原理,RPC监控之滑动窗口的实现原理( 三 )
在这个示例程序的代码中 , eventStream流通过interval操作符每100毫秒发送一个随机值(0或1) , 随机值为0代表失败 , 为1代表成功 , 模拟HystrixCommand的事件发送机制 。
桶计数流bucketedCounterStream使用window操作符以300毫秒为一个时间桶窗口 , 将原始的事件流进行拆分 , 每个时间桶窗口的3事件聚合起来 , 输出一个新的Observable(子流) 。 然后 , bucketedCounterStream通过flapMap操作将每一个Observable进行扁平化 。
桶计数流bucketedCounterStream的处理过程如图5-15所示 。
本文插图
图5-15 模拟的桶计数流bucketedCounterStream的处理过程
bucketedCounterStream的flapMap扁平化操作是通过调用reduceBucketToSummary方法完成的 , 该方法首先将每一个时间桶窗口内的Observable子流内的元素序列转成一个列表(List) , 然后进行过滤(留下值为0事件)和统计 , 返回值为0的元素统计数量(失败数) 。
接下来 , 需要对bucketedCounterStream桶计数进行汇总统计 , 形成滑动窗口的统计数据 , 这个工作由bucketedRollingCounterStream桶滑动统计流完成 。
桶滑动统计流仍然使用window和flatMap两个操作符 , 先在输入流中通过window操作符按照步长为1、长度为3的规则划分滑动窗口 , 每个滑动窗口的3统计数据被聚集起来 , 输出一个新的Observable 。 然后通过flatMap扁平化操作符对每一个Observable进行聚合 , 计算出各元素的累加值 。
模拟的桶滑动统计流bucketedRollingCounterStream的处理过程如图5-16所示 。
本文插图
图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每隔一个时间桶窗口就把这段时间内的所有调用事件聚合到一个累积桶内 。 下面来看一下它的实现 。
- 科学家|科学家预言:“未来人类将培育出所有人体器官。”
- 科学家|中国跨越式发展!“人造粮食”研发大获成功,有望解决粮食危机?
- 医生|全国400余位专家呼吁:脐带血很多优势,科学认识它!
- 亚马逊|2019年,一头座头鲸出现在亚马逊雨林中,生物学家百思不得其解!
- 科学家|宇宙中五个让人不能深思的问题,越想越觉得不可思议
- 微生物|吸氧90天,年轻25岁?以色列科学家:不是一般的氧气
- 科学家|南非科学家发现新病毒变种
- |人工智能揭示了以前未知的生物学--我们可能不知道我们细胞中的一半内容
- 亚马逊|机器学习解决了谁是谁的问题
- 卫星|大学生搞出“饿了么”,668亿卖给马云, 转身投资教育产品再赚百亿
