原链接:www.jianshu.com/p/ceb48ed87…
速度:由于二者运行在不同线程,发送速度和处理速度会出现不匹配。一般前者大于后者
问题描述:发送事件速度 > 处理事件速度,导致来不及响应(缓存区溢出 & 事件丢失 & OOM)
原理:Flowable 非阻塞式背压
- 有缓存区,先发先进
- 缓存区FIFO
- 缓存区大小够大 = 128
版本问题:1.0使用Observable,2.0新实现Flowable
Flowable与ObServable的区别
整体流程:
- 被观察者Flowable发送事件
- 事件进入缓存区,此时观察者还未接受事件 观察者执行事件为0
- 观察者请求若干事件request(n),从缓存区中取出若干事件开始执行
- 执行完n个事件后等待下次request
- 超出缓存区大小就onError抛出异常
同步情况下
默认情况没有指定发送和处理线程 (会出现):
- 无缓存区,发一个处理完才能接着发下一个
- 理论上不会出现速度不匹配问题,但是会有收发事件数目不匹配问题
如果不指定request会出现:
但Observable不会出现
同步线程如何解决:发送事件数 == 接受事件数
- 通过全局变量
- 通过emitter.requested();
emitter.requested的特性
- 可叠加性:
- 实时更新:执行完一个任务自动 emitter.requested- 1
- 异常:emitter.requested = 0 时,继续发送事件就抛异常
异步情况下
二者线程不同
request只会在三个值:0/96/128 感兴趣可看源码
BackpressureStrategy参数:处理策略 缓存区满了还继续发>128
- ERROR(默认):抛出异常
2. MISSING:和ERROR差不多,只不过友好一点
3. BUFFER:设置缓存区大小无限大,但要注意oom
4. DROP: 超出缓存区大小的就丢弃
5. LATEST:缓存数量为128(前128个)+1(最后一个信息)