Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~
5.47k stars 776 forks source link

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

Open MoJieBlog opened 4 years ago

Blues9527 commented 4 years ago

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

LineCutFeng commented 4 years ago

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

mlinqirong commented 2 years ago

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

senlinxuefeng commented 2 years ago

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