美文网首页
RxJava背压

RxJava背压

作者: chenhao911x | 来源:发表于2018-10-04 23:51 被阅读0次

    订阅分为:同步订阅 异步订阅

    同步订阅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事件)

    相关文章

      网友评论

          本文标题:RxJava背压

          本文链接:https://www.haomeiwen.com/subject/hcufaftx.html