使用RxJava2正确处理背压和并发性

使用RxJava2正确处理背压和并发性,java,design-patterns,rx-java,rx-java2,Java,Design Patterns,Rx Java,Rx Java2,我有一个注册了回拨的服务,现在我想将其公开为可流动的,具有某些要求/限制: 不应阻止接收回调的线程(工作应交给观察者指定的其他线程/调度程序) 不应该因为消费者的速度减慢而引发任何异常 多个消费者可以相互独立地订阅它 消费者可以选择缓冲所有项目,这样就不会丢失任何项目,但是不应该在“producer”类中缓冲这些项目 下面是我目前拥有的 class MyBroadcaster { private PublishProcessor<Packet> packets = Publi

我有一个注册了回拨的服务,现在我想将其公开为
可流动的
,具有某些要求/限制:

  • 不应阻止接收回调的线程(工作应交给观察者指定的其他线程/调度程序)
  • 不应该因为消费者的速度减慢而引发任何异常
  • 多个消费者可以相互独立地订阅它
  • 消费者可以选择缓冲所有项目,这样就不会丢失任何项目,但是不应该在“producer”类中缓冲这些项目
  • 下面是我目前拥有的

    class MyBroadcaster {
        private PublishProcessor<Packet> packets = PublishProcessor.create();
        private Flowable<Packet> backpressuredPackets = packets.onBackpressureLatest();
    
        public MyBroadcaster() {
           //this is actually different to my exact use but same conceptually
           registerCallback(packets::onNext);
        }
    
        public Flowable<Packet> observeAllPacketsOn(Scheduler scheduler) {
            return backpressuredPackets.observeOn(scheduler);
        }
    }
    
    class MyBroadcaster{
    private PublishProcessor数据包=PublishProcessor.create();
    private Flowable backpressuredPackets=packets.onBackpressureLatest();
    公共广播公司(){
    //这实际上与我的确切用法不同,但在概念上是相同的
    registerCallback(数据包::onNext);
    }
    公共可流动observeAllPacketsOn(调度程序){
    返回backpressuredPackets.observeOn(调度程序);
    }
    }
    
    我不确定这是否符合我的要求。在
    onBackpressureLatest
    javadoc上有一条关于
    observeOn
    的注释,我不明白:

    请注意,由于背压请求是如何通过subscribeOn/observeOn传播的,因此从下游请求1个以上的请求不能保证onNext事件的连续传递

    我还有其他问题:

    • onBackpressureLatest
      调用是否使项目不再进行多播
    • 如何测试我的需求
    • 奖励:如果我有多个这样的发布者(在同一个类或其他地方),那么让相同模式可重用的最佳方法是什么。使用委派/额外方法创建我自己的可流动文件
    我不确定这是否符合我的要求

    事实并非如此。分别在
    observeSomePacketsOn
    observealpacketson
    中应用
    onbackpressurelateest
    onBackpressureBuffer
    ,然后应用
    observeSomePacketsOn

    OnBackPressureRelatest调用是否使项目不再进行多播

    多播由
    PublishProcessor
    完成,不同的订户将独立建立一个频道,其中
    OnBackPressurexx
    observeOn
    运营商对单个订户生效

    如何测试我的需求

    使用
    TestSubscriber
    Flowable.test()
    )通过有损或无损
    Flowable
    订阅,将一组已知的数据包馈送到
    数据包中
    ,查看是否所有数据包都通过
    TestSubscriber.assertValueCount()
    TestSubscriber.values()
    到达。有损耗的应为1。。N,在宽限期之后,无损的应该有N个值

    奖励:如果我有多个这样的发布者(在同一个类或其他地方),那么让相同模式可重用的最佳方法是什么。使用委派/额外方法创建我自己的可流动文件

    您可以将
    observeAllPacketsOn
    转换为
    FlowableTransformer
    ,使用
    compose
    代替MyBroadcaster上的方法调用,例如:

    类别MyTransformers{
    公共静态可流动变压器lossyObserveOn(调度器s){
    返回f->f.onBackpressureLatest().observeOn(s);
    }
    }
    新建MyBroadcaster().getPacketFlow()
    .compose(MyTransformers.lossyObserveOn(调度程序))
    .认购(/*…*/);
    
    我不确定这是否符合我的要求

    事实并非如此。分别在
    observeSomePacketsOn
    observealpacketson
    中应用
    onbackpressurelateest
    onBackpressureBuffer
    ,然后应用
    observeSomePacketsOn

    OnBackPressureRelatest调用是否使项目不再进行多播

    多播由
    PublishProcessor
    完成,不同的订户将独立建立一个频道,其中
    OnBackPressurexx
    observeOn
    运营商对单个订户生效

    如何测试我的需求

    使用
    TestSubscriber
    Flowable.test()
    )通过有损或无损
    Flowable
    订阅,将一组已知的数据包馈送到
    数据包中
    ,查看是否所有数据包都通过
    TestSubscriber.assertValueCount()
    TestSubscriber.values()
    到达。有损耗的应为1。。N,在宽限期之后,无损的应该有N个值

    奖励:如果我有多个这样的发布者(在同一个类或其他地方),那么让相同模式可重用的最佳方法是什么。使用委派/额外方法创建我自己的可流动文件

    您可以将
    observeAllPacketsOn
    转换为
    FlowableTransformer
    ,使用
    compose
    代替MyBroadcaster上的方法调用,例如:

    类别MyTransformers{
    公共静态可流动变压器lossyObserveOn(调度器s){
    返回f->f.onBackpressureLatest().observeOn(s);
    }
    }
    新建MyBroadcaster().getPacketFlow()
    .compose(MyTransformers.lossyObserveOn(调度程序))
    .认购(/*…*/);
    
    在一个方法中调用
    onbackpressurexx
    与一次调用并在所有用户中共享有什么不同?他们有什么干涉吗?感谢您的回答,对于rxjava github问题,这些问题问得更好吗?在方法中调用
    onBackPressureXXX
    与在所有用户中共享一次有什么不同?他们有什么干涉吗?感谢您的回答,在rxjava上问这些问题更好吗