RxJava 中的“背压(Backpressure)”,简单来说,就是当上游发送数据的速度,快于下游处理数据的速度时,如何控制数据流动,避免系统被压垮的机制。
在 RxJava 中,典型的流是这样的:
上游 Observable / Flowable -> 下游 Observer / Subscriber
如果:
就会出现问题:
这就是背压问题。
ObservableObservable.create(emitter -> {
while (true) {
emitter.onNext("data");
}
})
.subscribe(data -> {
Thread.sleep(1000); // 处理很慢
});
❌ 没有背压控制
✅ 适合:事件少、处理快的场景(如点击事件)
FlowableFlowable.create(emitter -> {
for (int i = 0; i < 1000; i++) {
emitter.onNext(i);
}
}, BackpressureStrategy.BUFFER)
.subscribe(new Subscriber<Integer>() {
@Override
public void onSubscribe(Subscription s) {
s.request(1); // 告诉上游:我一次只处理 1 个
}
@Override
public void onNext(Integer integer) {
// 处理数据
}
});
✅ Flowable 专门用来解决背压
在 Flowable.create() 中经常用到:
| 策略 | 说明 |
|---|---|
BUFFER |
缓存所有数据(可能 OOM) |
DROP |
下游处理不过来,直接丢弃新数据 |
LATEST |
只保留最新的一条 |
ERROR |
超出处理能力直接抛异常 |
MISSING |
不处理背压(自己控制) |
通过 Subscription.request(n):
s.request(1); // 每次只请求 1 个数据
这是响应式拉模型(pull),而不是上游硬推。
RxJava 背压 = 下游控制上游发送速度,防止数据堆积压垮系统
Observable:不关心背压Flowable:解决背压如果你愿意,我也可以用**生活例子(比如水龙头和水桶)**再讲一遍,或者结合 Kotlin + 协程 对比说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。