簡體   English   中英

Observable vs Flowable rxJava2

[英]Observable vs Flowable rxJava2

我一直在尋找新的rx java 2,我不太確定我理解backpressure的想法了......

我知道我們有沒有backpressure支持的Observable和有它的Flowable

所以基於例子,假設我有interval flowable

        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
                }
            });

這根本不會崩潰,即使我延遲消耗它仍然有效。 為了使Flowable的工作可以說我把onBackpressureDrop運營商,死機消失了,但並不是所有的值要么發出。

所以我目前無法找到答案的基本問題是,當我可以使用普通Observable時,為什么我應該關心backpressure仍然可以在不管理buffer情況下接收所有值? 或者從另一方面來看, backpressure什么優勢可以幫助我管理和處理消費?

在實踐中表現出的背壓是有界緩沖區, Flowable.observeOn有一個128個元素的緩沖區,它們可以像下游一樣快速地消耗掉它。 您可以單獨增加此緩沖區大小以處理突發源,並且所有背壓管理實踐仍適用於1.x. Observable.observeOn有一個無限制的緩沖區,不斷收集元素,你的應用程序可能會耗盡內存。

您可以使用Observable例如:

  • 處理GUI事件
  • 使用短序列(總共少於1000個元素)

您可以使用Flowable例如:

  • 冷和非定時源
  • 發電機像源
  • 網絡和數據庫訪問器

Backpressure是指您的observable(發布者)創建的事件多於訂閱者可以處理的事件。 因此,您可以讓訂閱者丟失事件,或者您可以獲得一個巨大的事件隊列,這些事件最終會導致內存不足。 Flowable考慮背壓。 Observable不到。 而已。

它讓我想起了一個漏斗,當它有太多的液體溢出時。 Flowable可以幫助我們避免這種情況發生:

具有巨大的背壓:

在此輸入圖像描述

但是使用可流動的,背壓要小得多:

在此輸入圖像描述

Rxjava2有一些背壓策略,你可以根據你的用例使用。 通過策略我的意思是Rxjava2提供了一種方法來處理由於溢出(背壓)而無法處理的對象。

這是策略。 我不會詳細介紹它們,但是例如,如果您不想擔心溢出的項目,可以使用這樣的放置策略:

observable.toFlowable(BackpressureStrategy.DROP)

據我所知,隊列上應該有128個項目限制,之后可能會出現溢出(背壓)。 即使它不是128接近那個數字。 希望這有助於某人。

如果你需要從128更改緩沖區大小,它看起來像這樣可以完成(但看看任何內存約束:

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

在軟件開發中,通常背壓策略意味着你告訴發射器減慢一點,因為消費者無法處理你的發射事件的速度。

事實上你的Flowable在沒有背壓處理后發出128個值后崩潰並不意味着它在經過128個值之后總會崩潰:有時它會在10之后崩潰,有時它根本不會崩潰。 我相信當你用Observable嘗試這個例子時會發生這種情況 - 碰巧沒有背壓,所以你的代碼工作正常,下次可能沒有。 RxJava 2的不同之處在於Observable s中沒有背壓概念,也無法處理它。 如果您正在設計可能需要明確背壓處理的反應性序列 - 那么Flowable是您的最佳選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM