背压问题---Rxjava

262 阅读1分钟

关于背压的产生

主要问题: 在一些消息事件处理中,当消息的接收处理速度跟不上消息的发送速度,从而导致数据不匹配,造成积压。

rxjava 中,被观察者发送事件的速度大于观察者接收事件的速度时,观察者内会创建一个无限制大少的缓冲池存储未接收的事件,如果不能及时正确处理背压问题,会导致一些严重的问题,例如数据丢失、OOM等。 参考下面例子:

每500ms发送一次数据,但却是每5000m接收一次数据,这会导致 buffer 积压严重,内存上涨。

image.png

image.png

image.png

Flowable的背压处理

rxjava中,处理背压问题通常用 Flowable,他的默认缓冲池大小是128

image.png

但对比了 FlowableObservable 的区别,其实 Flowable 就多了背压操作符这几个。

Flowable的背压策略

image.png 我们就来说下这几种不同的背压策略

image.png

1、ERROR

当被观察者发送事件大于128时,观察者抛出异常并终止接收事件,但不会影响被观察者继续发送事件。

image.png

image.png

2、BUFFER

与Observable一样存在背压问题,但是接收性能比Observable低,因为BUFFER类型通过BufferAsyncEmitter添加了额外的逻辑处理,再发送至观察者。

3、DROP

每当观察者接收128事件之后,就会丢弃部分事件。

4、LATEST

与DROP使用效果一样,但LATEST会保证能接收最后一个事件,而DROP则不会保证。

5、MISSING

MISSING就是没有采取背压策略的类型,效果跟Obserable一样。 在设置MISSING类型时,可以配合onBackPressure相关操作符使用。