Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2020-01-07:谈一谈RxJava背压原理?

MoJieBlog opened this issue · comments

在异步的情况下,当上游事件发送的速度大于下游处理事件的速度时,称之为背压,此时会生成一个无限大的缓冲池去缓存事件。在RxJava中,Flowable是支持背压策略的。

总共分为4种策略
1.BackpressureStrategy.ERROR:若上游发送事件速度超出下游处理事件能力,且事件缓存池已满,则抛出异常
//阻塞时队列
2.BackpressureStrategy.BUFFER:若上游发送事件速度超出下游处理能力,则把事件存储起来等待下游处理
3.BackpressureStrategy.DROP:若上游发送事件速度超出下游处理能力,事件缓存池满了后将之后发送的事件丢弃
4.BackpressureStrategy.LATEST:若上有发送时间速度超出下游处理能力,则只存储最新的128个事件

当上游发送的事件过快或者过多的话就会形成阻塞 导致内存溢出 为了解决这一现象Rxjava2.0推出了Flowable 和 Subscriber 用来支持背压策略
MISSING:如果流的速度无法保持同步,可能会抛出 MissingBackpressureException 或 IllegalStateException。
BUFFER:上游不断的发出 onNext 请求,直到下游处理完,也就是和 Observable 一样了,缓存池无限大,最后直到程序崩溃。
ERROR:会在下游跟不上速度时抛出 MissingBackpressureException。
DROP:会在下游跟不上速度时把 onNext 的值丢弃。
LATEST:会一直保留最新的 onNext 的值,直到被下游消费掉。

总共分为4种策略
1.BackpressureStrategy.ERROR:若上游发送事件速度超出下游处理事件能力,且事件缓存池已满,则抛出异常
//阻塞时队列
2.BackpressureStrategy.BUFFER:若上游发送事件速度超出下游处理能力,则把事件存储起来等待下游处理
3.BackpressureStrategy.DROP:若上游发送事件速度超出下游处理能力,事件缓存池满了后将之后发送的事件丢弃
4.BackpressureStrategy.LATEST:若上有发送时间速度超出下游处理能力,则只存储最新的128个事件
响应式编程RxJava的理解