RxJava 背压策略BackpressureStrategy

79 阅读2分钟

原链接:www.jianshu.com/p/ceb48ed87…

速度:由于二者运行在不同线程,发送速度和处理速度会出现不匹配。一般前者大于后者

问题描述:发送事件速度 > 处理事件速度,导致来不及响应(缓存区溢出 & 事件丢失 & OOM)

原理:Flowable 非阻塞式背压

  • 有缓存区,先发先进
  • 缓存区FIFO
  • 缓存区大小够大 = 128
    版本问题:1.0使用Observable,2.0新实现Flowable

image.png

image.png

Flowable与ObServable的区别

image.png

整体流程:

  1. 被观察者Flowable发送事件
  2. 事件进入缓存区,此时观察者还未接受事件 观察者执行事件为0
  3. 观察者请求若干事件request(n),从缓存区中取出若干事件开始执行
  4. 执行完n个事件后等待下次request
  5. 超出缓存区大小就onError抛出异常

image.png

同步情况下

默认情况没有指定发送和处理线程 (会出现):

  1. 无缓存区,发一个处理完才能接着发下一个
  2. 理论上不会出现速度不匹配问题,但是会有收发事件数目不匹配问题

image.png

如果不指定request会出现:

image.png 但Observable不会出现

同步线程如何解决:发送事件数 == 接受事件数

  • 通过全局变量
  • 通过emitter.requested();

image.png

emitter.requested的特性

  • 可叠加性:

image.png

  • 实时更新:执行完一个任务自动 emitter.requested- 1
  • 异常:emitter.requested = 0 时,继续发送事件就抛异常

异步情况下

二者线程不同

image.png

request只会在三个值:0/96/128 感兴趣可看源码

image.png

BackpressureStrategy参数:处理策略 缓存区满了还继续发>128

image.png

  1. ERROR(默认):抛出异常

image.png 2. MISSING:和ERROR差不多,只不过友好一点

image.png 3. BUFFER:设置缓存区大小无限大,但要注意oom

image.png 4. DROP: 超出缓存区大小的就丢弃

image.png 5. LATEST:缓存数量为128(前128个)+1(最后一个信息)

image.png