Rx java RxJava share()运算符:慢速订阅服务器影响快速订阅服务器
我有一个Rx java RxJava share()运算符:慢速订阅服务器影响快速订阅服务器,rx-java,rx-java2,Rx Java,Rx Java2,我有一个可流动的,在一个用户和一个用户之间共享,前者缓慢地消耗发出的项目,后者快速地消耗它们 可流动共享可流动= 可流动。生成(()->0L,(状态,发射器)->{ 发射器.onNext(州); 返回状态+1; }) .share() .cast(长类); 共享流动 .observeOn(计算()) .subscribowith(新的PaceSubscriber(“arthur”,1000,1)); 共享流动 .observeOn(计算()) .subscribowith(新的PaceSubsc
可流动的
,在一个用户和一个用户之间共享,前者缓慢地消耗发出的项目,后者快速地消耗它们
可流动共享可流动=
可流动。生成(()->0L,(状态,发射器)->{
发射器.onNext(州);
返回状态+1;
})
.share()
.cast(长类);
共享流动
.observeOn(计算())
.subscribowith(新的PaceSubscriber(“arthur”,1000,1));
共享流动
.observeOn(计算())
.subscribowith(新的PaceSubscriber(“福特”,1,1));
基本上,PaceSubscriber
执行线程。睡眠(.)
。睡眠时间是构造函数的第二个参数。第三个是订阅者通过调用request方法request(.)
我观察到的是以下现象:
- 快速订户接收一定数量的项目
- 然后,它似乎是“冻结”和等待
- 接收一定数量项目的最慢订户
- 等等
2018-04-03 13:39:44 [INFO ] [RxComputationThreadPool-2] INFO ford ⇶ received onNext(): 0
2018-04-03 13:39:44 [INFO ] [RxComputationThreadPool-2] INFO ford ⇶ received onNext(): 1
...
2018-04-03 13:39:44 [INFO ] [RxComputationThreadPool-2] INFO ford ⇶ received onNext(): 255
2018-04-03 13:39:47 [INFO ] [RxComputationThreadPool-3] INFO arthur ⇶ received onNext(): 130
2018-04-03 13:39:48 [INFO ] [RxComputationThreadPool-3] INFO arthur ⇶ received onNext(): 131
...
2018-04-03 13:41:21 [INFO ] [RxComputationThreadPool-3] INFO arthur ⇶ received onNext(): 224
2018-04-03 13:41:21 [INFO ] [RxComputationThreadPool-2] INFO ford ⇶ received onNext(): 257
2018-04-03 13:41:21 [INFO ] [RxComputationThreadPool-2] INFO ford ⇶ received onNext(): 258
实际上,我希望每个订阅者都能以自己的速度处理传入的项目,而不需要他们之间进行任何交互。特别是,我没想到最慢的用户会以最快的速度慢下来。
我想知道这是一个问题还是一个预期的行为。我怀疑与observeOn()
管理一个接收项目队列以及与一些背压支持相关的事情有关,但如果我能对此有一些有见地的解释,我会很高兴
可以找到完整的代码
非常感谢
实际上,我希望每个订阅者都能以自己的速度处理传入的项目,而不需要他们之间进行任何交互
这是发布
的行为,它是共享
在引擎盖下使用的。耗电元件以锁步方式供电,因此在默认情况下,由于耗电元件中存在任何潜在的速度差异,不必产生过多的缓冲
例如,您必须通过onBackpressureBuffer
手动解除较慢的流的绑定,但这可能会导致内存使用过多
这种行为是由于背压效应(最慢的路径尚未准备好接收项目)造成的,部分原因是为了避免在复杂的计时情况下丢失数据
实际上,我希望每个订阅者都能以自己的速度处理传入的项目,而不需要他们之间进行任何交互
这是发布
的行为,它是共享
在引擎盖下使用的。耗电元件以锁步方式供电,因此在默认情况下,由于耗电元件中存在任何潜在的速度差异,不必产生过多的缓冲
例如,您必须通过onBackpressureBuffer
手动解除较慢的流的绑定,但这可能会导致内存使用过多
这种行为是由于背压效应(最慢的路径尚未准备好接收项目)造成的,部分原因是为了避免在复杂的计时情况下丢失数据