背压(back-pressure)问题

在响应式编程中看到 back-pressure 这词的时候,还是很懵逼的,毕竟在编程资料中出现这样的字眼,后来查资料在知乎中这个人的解释还是挺形象的。

在数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,这种现象就叫做 Backpressure 出现。编程中的 Backpressure 这个概念源自工程概念中的 Backpressure:在管道运输中,气流或液流由于管道突然变细、急弯等原因导致由某处出现了下游向上游的逆向压力,这种情况称作「back pressure」。这是一个很直观的词:向后的、往回的压力——back pressure。

也看到从背压引申到更大额话题流控(Flow Control,Backpressure只是解决Flow Control的其中一个方案。我们小学做的那种数学题:一个水池,有一个进水管和一个出水管。如果进水管水流更大,过一段时间水池就会满(溢出),这是没有做好流控的结果。

这里有两个名词:

cold Observable:只有当有订阅者订阅的时候, Cold Observable 才开始执行发射数据流的代码,是那些允许降低速率的发送源。

hot Observable:不管有没有订阅者订阅,他们创建后就开发发射数据流。

然后我们写段代码测试一下发送者比接受者处理速度快的例子:

运行一下会发生什么呢

被观察者发送事件的速度太快,而观察者处理太慢,而且你还没有做相应措施,所以报异常抛出MissingBackpressureException。

响应式拉取,可以反过来,观察者主动从被观察者那里去拉取数据,而被观察者变成被动的等待通知再发送数据。下面是我看到的大家文章里都喜欢举的例子,在代码中,传递事件开始前的onstart()中,调用了request(1),通知被观察者先发送一个事件,然后在onNext()中处理完事件,再次调用request(1),通知被观察者发送下一个事件。

观察者可以根据自身实际情况按需拉取数据,而不是被动接收(也就相当于告诉上游观察者把速度慢下来),实现了背压的策略。当然 Rx 还提供了许多操作符号。

参考:

https://www.zhihu.com/question/49618581/answer/237078934

https://www.jianshu.com/p/2c4799fa91a4

猜你喜欢

转载自my.oschina.net/u/2277632/blog/1824674