part06_Rxjava背壓原理

weixin_33860722發表於2018-08-30

作者:IT魔幻師
部落格:www.huyingzi.top
轉載請註明出處:https://www.jianshu.com/p/23f74055e999


一、RxJava1與RxJava2 對比

  • RxJava 2x 不再支援 null 值,如果傳入一個null會丟擲 NullPointerException

  • Observable.just(null)(不支援)

  • RxJava2 所有的函式介面(Function/Action/Consumer)均設計為可丟擲Exception,自己去解決編譯異常需要轉換問題。

  • RxJava1 中Observable不能很好支援背壓,在RxJava2 中將Oberservable實現成不支援背壓,而新增Flowable 來支援背壓

二、背壓

事件上游產生的事件高於事件下游消費的事件導致記憶體不斷擴大
rxjava1並沒有對這個的解決方案
rxjava2
新增了一個新的被觀察者角色操作符Flowable所有的Observable操作都可以用Flowable替換

什麼時候用 Observable:
一般處理最大不超過1000條資料,並且幾乎不會出現記憶體溢位
如果式 滑鼠事件,頻率不超過1000 Hz,基本上不會背壓;

什麼時候用 Flowable:
處理以某種方式產生超過10K的元素;
檔案讀取與分析,例如 讀取指定行數的請求;網路IO流;
有很多的阻塞和/或 基於拉取的資料來源,但是又想得到一個響應式非阻塞介面的。

三、背壓策略

1.BackpressureStrategy.ERROR:若上游傳送事件速度超出下游處理事件能力,且事件快取池已滿,則丟擲異常
//阻塞時佇列
2.BackpressureStrategy.BUFFER:若上游傳送事件速度超出下游處理能力,則把事件儲存起來等待下游處理
3.BackpressureStrategy.DROP:若上游傳送事件速度超出下游處理能力,事件快取池滿了後將之後傳送的事件丟棄
4.BackpressureStrategy.LATEST:若上有傳送時間速度超出下游處理能力,則只儲存最新的128個事件

四、Flowable的使用

   @Test
    public void testFlowable() {
        Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> emitter) throws Exception {
                for (int i = 0; i < 1000000; i++) {
                    emitter.onNext(i);
                }
            }
        }, BackpressureStrategy.ERROR).subscribe(new FlowableSubscriber<Integer>() {
            @Override
            public void onSubscribe(Subscription s) {
                //使用Flowable需要在此處給其一個最大的事件處理能力
                //設定為最大的處理能力
                s.request(500);
//                s.request(Integer.MAX_VALUE);
            }

            @Override
            public void onNext(Integer integer) {
                //模擬處理
                try {
                    Thread.currentThread().sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("處理事件:"+integer);

            }

            @Override
            public void onError(Throwable t) {

            }

            @Override
            public void onComplete() {

            }
        });
    }

相關文章