part06_Rxjava背壓原理
作者: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() {
}
});
}
相關文章
- spark調優-背壓Spark
- 5章 RxJava背壓策略RxJava
- RxJava 系列-2:背壓和 FlowableRxJava
- firewalld: 背後的原理(nftables)
- Node.js 指南(流中的背壓)Node.js
- RxJava2 系列-2:背壓和FlowableRxJava
- RxJava2系列之背壓策略(一)RxJava
- 手柄漂移背後的科學原理
- Redis 記憶體壓縮原理Redis記憶體
- Android Rxjava :最簡單&全面背壓講解 (Flowable)AndroidRxJava
- 響應式流的核心機制——背壓機制
- 梯度下降背後的數學原理幾何?梯度
- 解讀銀行卡支付背後的原理
- 開源網格VPN meshboi及其背後原理
- Oracle RMAN備份以及壓縮原理分析Oracle
- Lepton 無失真壓縮原理及效能分析
- Rxjava2(二)、五種觀察者模式建立及背壓RxJava模式
- Reverse原理背後的數學和魔幻藝術
- 收款神器!解讀聚合收款碼背後的原理
- Python 3.11以來效能改進的背後原理Python
- 框架雖好,但不要丟了其背後的原理框架
- 大模型原理:遞迴、壓縮和模式匹配大模型遞迴模式
- [譯]RxJava 的全面介紹:Observable 型別、背壓、錯誤處理RxJava型別
- rxjs Observable 設計原理背後的 Pull 和 Push 思路JS
- 聊一聊Unity協程背後的實現原理Unity
- Dubbo 3 之 Triple 流控反壓原理解析
- 乾貨分享:細說雙 11 直播背後的壓測保障技術
- 漲知識了!Wi-Fi背後的原理揭祕!
- 簡單聊聊 GZIP 的壓縮原理與日常應用
- WebP影像格式的原理 與影像壓縮的關係Web
- RTC 科普視訊丨聊聊空間音訊的原理與其背後的聲學原理音訊
- ???由淺至深瞭解webpack非同步載入背後的原理Web非同步
- 【原始碼分析】Lottie 實現炫酷動畫背後的原理原始碼動畫
- 【原始碼&庫】Vue3 中的 nextTick 魔法背後的原理原始碼Vue
- PNG圖片壓縮原理解析--屌絲的眼淚
- git原理學習記錄:從基本指令到背後原理,實現一個簡單的gitGit
- Js實現任意位置縮放圖片,深入理解背後原理JS
- 修復損壞的gzip壓縮檔案之原理篇