首页 行业资讯 宠物日常 宠物养护 宠物健康 宠物故事

如何形象的描述反应式编程中的背压机制

发布网友

我来回答

1个回答

热心网友

在 Rx 中,只要生产者生产完数据,就把数据发出去了。同步的情况下,先后事件的消费会阻塞等待,这样当然不会有什么问题;但是异步情况下,问题就来了,消费者消费的速度赶不上生产者发射数据的速度,消费者没能力去消费生产者发过来的消息了,生活中供大于求,就会造成通货膨胀,在 RxJava 里也一样,供大于求,就会抛出异常(rx.exceptions.MissingBackpressureException),需要一些『宏观*』的*。一些常见场景:快速点击、数据库查询、键盘输入、网络请求等等。
既然明确了问题症结所在,那么相应的解决方案就显而易见了,既然『供大于求』,那么
①要么减少单位时间的供给;
②要么浪费掉;
③要么存起来,等到有能力了再去消费;
④要么提高消费能力。
在 Rx 里,观察者和被观察者都已经确定了,要提高消费者(即观察者)的消费能力,显然是不行了,所以就剩下其他的解决方案了。
既然数据发送的过快,就可以选择性地丢弃一些数据,题主提到的几个操作符都是这种方案(throttle,debounce,onBackpressureDrop);
将多余的暂时无法处理的数据缓存起来,直到消费者有能力处理(buffer,window,onBackpressureBuffer);
从生产者入手,降低生产者发送数据的速度。在 Subscriber 里有 request(long n) 方法,在 onStart 里调用这个方法,告诉生产者,消费者每次可以处理多少数据;在 onStart 里调用 request(0),然后通过提供 requestMore(long n) 方法去调用 request(n) ,可以实现生产者 lazy push。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com