深入讲解RxJava响应式编程框架,背压问题的几种应对模式

文章首发公众号:Java架构师联盟,每日更新技术好文

背压

本节首先介绍什么是背压(Backpressure)问题,然后介绍背压问题的几种应对模式。

深入讲解RxJava响应式编程框架,背压问题的几种应对模式

什么是背压问题

当上下游的流操作处于不同的线程时,如果上游弹射数据的速度快于下游接收处理数据的速度,对于那些没来得及处理的数据就会造成积压,这些数据既不会丢失,又不会被垃圾回收机制回收,而是存放在一个异步缓存池中,如果缓存池中的数据一直得不到处理,越积越多,最后就会造成内存溢出,这便是响应式编程中的背压问题。

一个存在背压问题的演示实例代码如下:

package com.crazymaker.demo.rxJava.basic;
//省略import
@Slf4j
public class BackpressureDemo {
 /**
 *演示不使用背压
 */
 @Test
 public void testNoBackpressure() throws InterruptedException {
 //被观察者(主题)
 Observable observable = Observable.create(
 new Observable.OnSubscribe<String>() {
 @Override
 public void call(Subscriber<? super String> subscriber) {
 //循环10次
 for (int i = 0;i<10 ; i++) {
 log.info("produce ->" + i);
 subscriber.onNext(String.valueOf(i));
 }
 }
 });
 //观察者
 Action1<String> subscriber = new Action1<String>() {
 public void call(String s){
 try {
 //每消费一次间隔50毫秒
 Thread.sleep(50);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 log.info("consumer ->" + s);
 }
 };
 //订阅:observable与subscriber之间依然通过subscribe()进行关联
 observable
 .subscribeOn(Schedulers.io())
 .observeOn(Schedulers.newThread())
 .subscribe(subscriber);
 Thread.sleep(Integer.MAX_VALUE);
 }
}

在实例代码中,observable发射操作执行在一条通过Schedulers.io()调度器获取的IO线程上,而观察者subscriber的消费操作执行在另一条通过Schedulers.newThread()调度器获取的新线程上。observable流不断发送数据,累积发送10次;观察者subscriber每隔50毫秒接收一条数据。

运行上面的演示程序后,输出的结果如下:

17:56:17.719 [RxIoScheduler-2] INFO c.c.d.r.b.Backpres
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RxJava 中,背压(backpressure)是一种处理数据流速不匹配的机制。当被观察者(Observable)发射数据速度快于观察者(Subscriber)处理数据的速度时,就会出现背压的情况。 为了处理背压RxJava 提供了一些操作符和策略,可以根据具体的需求选择适合的方法。下面是一些常用的方法: 1. `onBackpressureBuffer()`:将发射的数据缓存在一个无限大小的缓冲区中,直到观察者准备好处理数据。 ```java Observable.range(1, 1000) .onBackpressureBuffer() .observeOn(Schedulers.io()) .subscribe(new Subscriber<Integer>() { @Override public void onSubscribe(Subscription s) { s.request(Long.MAX_VALUE); } @Override public void onNext(Integer integer) { // 处理数据 } @Override public void onError(Throwable t) { // 处理错误 } @Override public void onComplete() { // 完成操作 } }); ``` 2. `onBackpressureDrop()`:当观察者无法及时处理数据时,丢弃多余的数据。 ```java Observable.range(1, 1000) .onBackpressureDrop() .observeOn(Schedulers.io()) .subscribe(new Subscriber<Integer>() { @Override public void onSubscribe(Subscription s) { s.request(Long.MAX_VALUE); } @Override public void onNext(Integer integer) { // 处理数据 } @Override public void onError(Throwable t) { // 处理错误 } @Override public void onComplete() { // 完成操作 } }); ``` 3. `onBackpressureLatest()`:只保留最新的数据,丢弃旧的数据。 ```java Observable.range(1, 1000) .onBackpressureLatest() .observeOn(Schedulers.io()) .subscribe(new Subscriber<Integer>() { @Override public void onSubscribe(Subscription s) { s.request(Long.MAX_VALUE); } @Override public void onNext(Integer integer) { // 处理数据 } @Override public void onError(Throwable t) { // 处理错误 } @Override public void onComplete() { // 完成操作 } }); ``` 这些方法可以在被观察者和观察者之间进行数据流速的调节,以避免背压问题。根据具体的业务需求,选择适合的背压处理方法即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值