RxJava2 系列-2:背压和 Flowable

背压(Back Pressure)的概念最初并不是在响应式编程中提出的,它最初用在流体力学中,指的是后端的压力,
通常用于描述系统排出的流体在出口处或二次侧受到的与流动方向相反的压力。

在响应式编程中,我们可以将产生信息的部分叫做上游或者叫生产者,处理产生的信息的部分叫做下游或者消费者。
试想如果在异步的环境中,生产者的生产速度大于消费者的消费速度的时候,明显会出现生产过剩的情景,这时候就需要消费者对多余的数据进行缓存,
但如果生产的信息数量过多,以至于超出缓存大小,就会出现缓存溢出,甚至可能造成内存耗尽。

我们可以制定一个数据丢失的规则,来丢失那些“可以丢失的数据”,以减轻缓存的压力。
在之前我们介绍了一些方法,比如throttleXXXdebouncesample等,都是用来解决在生产速度过快的情况下的数据过滤的,它们指定了数据取舍的规则。
而在Flowable,我们可以通过onBackpressureXXX一系列的方法来制定当数据生产过快情况下的数据取舍的规则,

我们可以把这种处理方式理解成背压,所谓背压,在Rx中就是通过一种下游用来控制上游事件发射频率的机制(就像流体在出口受到了阻力一样)。
所以,如何理解背压呢?笔者认为,在力学中它是一种现象,在Rx中它是一种机制。

在这篇文章中,我们会先介绍背压的相关内容,然后我们再介绍一下onBackpressureXXX系列的方法。

关于RxJava2的基础使用和方法梳理可以参考:RxJava2 系列 (1):一篇的比较全面的 RxJava2 方法总结

说明:以下文章部分翻译自RxJava官方文档Backpressure (2.0)

1、背压机制

如果将生产和消费整体看作一个管道,生成看作上游,消费看作下游;
那么当异步的应用场景下,当生产者生产过快而消费者消费很慢的时候,可以通过背压来告知上游减慢生成的速度。

通常在进行异步的操作的时候会通过缓存来存储发射出的数据。在早期的RxJava中,这些缓存是无界的。
这意味着当需要缓存的数据非常多的时候,它们可能会占用非常多的存储空间,并有可能因为虚拟机不断GC而导致程序执行过慢,甚至直接抛出OOM。
在最新的RxJava中,大多数的异步操作内部都存在一个有界的缓存,当超出这个缓存的时候就会抛出MissingBackpressureException异常并结束整个序列。

然而,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值