关于背压的产生
主要问题: 在一些消息事件处理中,当消息的接收处理速度跟不上消息的发送速度,从而导致数据不匹配,造成积压。
在rxjava 中,被观察者发送事件的速度大于观察者接收事件的速度时,观察者内会创建一个无限制大少的缓冲池存储未接收的事件,如果不能及时正确处理背压问题,会导致一些严重的问题,例如数据丢失、OOM等。 参考下面例子:
每500ms发送一次数据,但却是每5000m接收一次数据
,这会导致 buffer 积压严重,内存上涨。
Flowable的背压处理
在rxjava中,处理背压问题通常用 Flowable
,他的默认缓冲池大小是128
但对比了 Flowable
和 Observable
的区别,其实 Flowable
就多了背压操作符这几个。
Flowable的背压策略
我们就来说下这几种不同的背压策略:
1、ERROR
当被观察者发送事件大于128时,观察者抛出异常并终止接收事件,但不会影响被观察者继续发送事件。
2、BUFFER
与Observable一样存在背压问题,但是接收性能比Observable低,因为BUFFER类型通过BufferAsyncEmitter添加了额外的逻辑处理,再发送至观察者。
3、DROP
每当观察者接收128事件之后,就会丢弃部分事件。
4、LATEST
与DROP使用效果一样,但LATEST会保证能接收最后一个事件,而DROP则不会保证。
5、MISSING
MISSING就是没有采取背压策略的类型,效果跟Obserable一样。 在设置MISSING类型时,可以配合onBackPressure相关操作符使用。