温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

rxjava背压是什么意思

发布时间:2026-10-11 05:43:31 来源:亿速云 阅读:88 作者:小樊 栏目:编程语言

RxJava 中的“背压(Backpressure)”,简单来说,就是当上游发送数据的速度,快于下游处理数据的速度时,如何控制数据流动,避免系统被压垮的机制。


一、为什么会有背压问题?

在 RxJava 中,典型的流是这样的:

上游 Observable / Flowable  ->  下游 Observer / Subscriber

如果:

  • 上游 疯狂发数据(比如读取文件、网络流、传感器)
  • 下游 处理很慢(比如 UI 更新、数据库写入)

就会出现问题:

  • 内存中堆积大量未处理数据
  • 最终导致 OOM(内存溢出)

这就是背压问题。


二、RxJava 中的两种类型

1️⃣ 不支持背压:Observable

Observable.create(emitter -> {
    while (true) {
        emitter.onNext("data");
    }
})
.subscribe(data -> {
    Thread.sleep(1000); // 处理很慢
});

❌ 没有背压控制
✅ 适合:事件少、处理快的场景(如点击事件)


2️⃣ 支持背压:Flowable

Flowable.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 专门用来解决背压


三、常见的背压策略(BackpressureStrategy)

在 Flowable.create() 中经常用到:

策略 说明
BUFFER 缓存所有数据(可能 OOM)
DROP 下游处理不过来,直接丢弃新数据
LATEST 只保留最新的一条
ERROR 超出处理能力直接抛异常
MISSING 不处理背压(自己控制)

四、下游如何控制背压?

通过 Subscription.request(n):

s.request(1); // 每次只请求 1 个数据

这是响应式拉模型(pull),而不是上游硬推。


五、一句话总结

RxJava 背压 = 下游控制上游发送速度,防止数据堆积压垮系统

  • Observable:不关心背压
  • Flowable:解决背压
  • 核心思想:你要多少,我发多少

如果你愿意,我也可以用**生活例子(比如水龙头和水桶)**再讲一遍,或者结合 Kotlin + 协程 对比说明。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手