背壓(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

相關文章
相關標籤/搜索