背压(back-pressure)问题

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

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

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

这里有两个名词:开发

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

hot Observable:无论有没有订阅者订阅,他们建立后就开发发射数据流。io

而后咱们写段代码测试一下发送者比接受者处理速度快的例子:响应式

运行一下会发生什么呢request

被观察者发送事件的速度太快,而观察者处理太慢,并且你尚未作相应措施,因此报异常抛出MissingBackpressureException。im

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

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

 

参考:

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

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

相关文章
相关标签/搜索