Rxjava2.0 新定义

背压 (backpressure)

在rxjava2.0 中了解了数据流的发射 处理 和响应 可以在独立线程中进行 ,
上游在处理数据的时候, 不知下游中是否将数据处理完成, 也不会等下游将数据处理完成之后发射
假设上游的数据发射的数据很快, 而下游的数据处理的很慢, 上游会产生许多没有被下游处理的数据 不会丢失 , 不会被垃圾回收机制回收,而是存放在一个异步缓存池中, 如果缓存池中的数据一直得不到处理, 越来越多 那么这个池子会越来越满, 最终就会溢出 最后造成内存溢出 , 这就是Rxjava 的背压问题 .

Rxjava1.0 和 Rxjava2.0 的区别
Rxjava2.0 新定义_第1张图片
storm_loveyao.png

背压这个概念大概就是: 背压是指在异步场景中,
被观察者发送事件速度远远快于观察者的处理速度的情况下, 一种告诉上游的被观察者降低发送速度的策略.

在Rxjava2.0 中把支持背压的和不支持背压的Observable区分出来 . Observeable 用来订阅Observer 不支持背压, Flowable 用于订阅Subscriber 支持背压 .

当被观察者快速发送大量的数据时, 下游不会做其他处理, 即使数据大量堆积, 调用链也不会报MissingBackpressureException, 消耗内存过大只会OOM(官方给出 1000个事件为分界线, )

Flowable

为了解决Flowable 是为了解决背压的问题, Flowable 发射的数据流 以及对于数据的加工的一些操作符, 都会支持背压 .

cerate方法中多了一个 BackpressureStrategy类

在发送数据的时候使用的发射器是FlowableEmitter 而不是ObservableEmitter .

BackperssureStrategy背压策略
 public enum BackpressureStrategy {
    ERROR,BUFFER,DROP,LATEST,MISSING
} 

是一个枚举类 ; 设置Flowable 通过

Error

这个策略下 , 如果放入Flowable缓存池中的数据超限了 , 会抛出 MissingBackpressureException 异常 /

DROP

如果 Flowable 的异步缓存池满了 会丢掉将要放入缓存池中的数据

缓存池子中的数据 不是Subscriber 接收一条,就清理一条, 而是每累计到95 条清理一次, 也就是当Subscriber接收到95 条的时候 缓存池才清理数据,, 之后发射的数据才可以放入 .

LATEST

和上面策略相同, 如果缓存池中满了 那么会丢掉将要放入缓存池中的数据, 但是不同的是 , 不管缓存池的状态如何, LATEST 都会将最后一条数据强行放入缓存池中.
所以 接收的是 flowable 发射的最后一条数据 .

BUFFER

Flowable 的异步缓存池同Observable 一样 没有固定大小, 可以无限制的添加数据到里面 , 不会抛出MIssingBackpressureException异常, 但是会OOM

MISSING

表示通过create方法创建的Flowable 没有指定背压策略, 不会对通过onNext发射的数据做缓存或丢弃处理,需要下游通过背压操作符来指定背压策略.

Flowable 在设计的时候 采用了一种新的思路 响应式拉取 来设置下游对数据的需求量, 上游可以根据下游的需求量 按需发射数据, 不显示的调用request会默认下游的需求量为0 , 运行后上游发射的数据不会交给下游的数据去处理.

你可能感兴趣的:(Rxjava2.0 新定义)