订阅分为:同步订阅 异步订阅
同步订阅Rxjava1与Rxjava2中 同步订阅没有用到缓冲区,只要上游事件数量不大于请求数量不会触发 MissingBackpressureException 异常,但是这种方式在数量多了以后会出现大量的内存使用率上升,有可能导致OOM。
同步订阅,存在问题,因为不存在缓冲区,发送事件超过接收事件抛出异常。这种可以通过 FlowableEmitter类的requested()控制被观察者发送速度,就是发送前先获取到观察者能接收多少个。异步订阅Rxjava1中的Observable与少量的操作符采用了背压处理。但是缓冲区的大小为16,如果上游数据超过16个同时发送事件会触发MissBackPressureException。
Rxjava2中的Observalbe不在支持背压策略。但是新增了Flowable支持背压策略。相对同步订阅存在缓冲区,多发送的事件会被存在缓冲区。事件积压超过一定数量会抛出MissingBackpressureException。
RxJava2采取了更先进的背压
策略模式1:BackpressureStrategy.ERROR
问题:发送事件速度 > 接收事件 速度,即流速不匹配具体
表现:出现当缓存区大小存满(默认缓存区大小 = 128)、被观察者仍然继续发送下1个事件时
处理方式:直接抛出异常MissingBackpressureException
模式2:BackpressureStrategy.MISSING
问题:发送事件速度 > 接收事件 速度,即流速不匹配
具体表现是:出现当缓存区大小存满(默认缓存区大小 = 128)、被观察者仍然继续发送下1个事件时
处理方式:友好提示:缓存区满了
模式3:BackpressureStrategy.BUFFER
问题:发送事件速度 > 接收事件 速度,即流速不匹配
具体表现是:出现当缓存区大小存满(默认缓存区大小 = 128)、被观察者仍然继续发送下1个事件时
处理方式:将缓存区大小设置成无限大 即被观察者可无限发送事件观察者,但实际上是存放在缓存区 但要注意内存情况,防止出现OOM
模式4: BackpressureStrategy.DROP
问题:发送事件速度 > 接收事件 速度,即流速不匹配
具体表现是:出现当缓存区大小存满(默认缓存区大小 = 128)、被观察者仍然继续发送下1个事件时
处理方式:超过缓存区大小(128)的事件丢弃 如发送了150个事件,仅保存第1 - 第128个事件,第129 -第150事件将被丢弃
模式5:BackpressureStrategy.LATEST
问题:发送事件速度 > 接收事件 速度,即流速不匹配
具体表现是:出现当缓存区大小存满(默认缓存区大小 = 128)、被观察者仍然继续发送下1个事件时
处理方式:只保存最新(最后)事件,超过缓存区大小(128)的事件丢弃 即如果发送了150个事件,缓存区里会保存129个事件(第1-第128 + 第150事件)