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
手动解除较慢的流的绑定,但这可能会导致内存使用过多

这种行为是由于背压效应(最慢的路径尚未准备好接收项目)造成的,部分原因是为了避免在复杂的计时情况下丢失数据