可观察 vs 可流动 rxJava2

2022-08-31 07:40:17

我一直在看新的rx java 2,我不太确定我是否理解了这个想法......backpressure

我知道我们有没有支持,有支持。ObservablebackpressureFlowable

因此,基于示例,假设我有:flowableinterval

        Flowable.interval(1, TimeUnit.MILLISECONDS, Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {
                    // do smth
                }
            });

这将在大约128个值之后崩溃,很明显,我的消耗速度比获取物品慢。

但是,我们有相同的Observable

     Observable.interval(1, TimeUnit.MILLISECONDS, Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {
                    // do smth
                }
            });

这根本不会崩溃,即使我延迟消费它仍然有效。为了工作,假设我把运算符,崩溃消失了,但也不是所有值都被发出。FlowableonBackpressureDrop

因此,我目前在脑海中找不到答案的基本问题是,为什么我应该关心何时可以使用普通仍然接收所有值而不管理?或者也许从另一方面来看,在管理和处理消费方面,我有什么优势?backpressureObservablebufferbackpressure


答案 1

背压在实践中表现为有界缓冲液,具有128个元素的缓冲液,其排水速度与陶氏流可以承受的速度一样快。您可以单独增加此缓冲区大小以处理突发源,并且所有背压管理实践仍从 1.x 开始应用。 具有一个不断收集元素的无限缓冲区,你的应用可能会耗尽内存。Flowable.observeOnObservable.observeOn

例如,您可以使用:Observable

  • 处理图形用户界面事件
  • 处理短序列(总共少于 1000 个元素)

例如,您可以使用:Flowable

  • 冷源和非定时源
  • 生成器如源
  • 网络和数据库访问器

答案 2

背压是指可观察对象(发布者)创建的事件多于订阅者可以处理的事件。因此,您可以让订阅者丢失事件,或者您可以获得庞大的事件队列,最终导致内存不足。流动性考虑了背压。 没有。就是这样。Observable

它让我想起了一个漏斗,当它有太多的液体溢出时。Flowable可以帮助不让这种情况发生:

具有巨大的背压:

enter image description here

但是使用可流动的,背压要少得多 :

enter image description here

Rxjava2有一些背压策略,你可以根据你的使用案例使用。通过策略,我的意思是Rxjava2提供了一种方法来处理由于溢出(背压)而无法处理的对象。

这是策略。我不会一一介绍,但例如,如果您不想担心溢出的项目,则可以使用如下的放置策略:

Observable.toFlowable(BackpressureStrategy.DROP)

据我所知,队列上应该有128个项目的限制,之后可能会有溢出(背压)。即使它不是128,它也接近这个数字。希望这有助于某人。

如果您需要将缓冲区大小从128更改为128,则看起来可以像这样完成(但请注意任何内存约束:

myObservable.toFlowable(BackpressureStrategy.MISSING).buffer(256); //but using MISSING might be slower.  

在软件开发中,通常的背压策略意味着您告诉发射器放慢速度,因为消费者无法处理您的发射事件的速度。


推荐