文章目錄
- 導言
- 回應式編程是什么?
- 回應式宣言
- 回應式系統應該具有什么特性
- 什么是彈性? 回彈性?
- 訊息驅動還是事件驅動?
- 回應式編程相關討論
- 為什么使用觀察者模式
- 什么是背壓(backPressure)
- 個人感想
- 相關檔案
導言
目前回應式編程還屬于大亂斗的時代,各家有各家的定義和實作,回應式宣言定義了回應式應該滿足的特性,Spring5有自己的回應式方案技術堆疊、廣為人知的rxJava所屬的reactiveX也有自己的理解,有的說回應式是基于事件的,有的說是基于資料流的,有人說回應式編程其實只是個便于并發編程的api庫,有人說回應式編程是一種編程思想、一種編程范型,技術圈子里各有各的說法,正如小馬哥所說: 一種技術,各自表述,回應式編程含糊不清、有些空洞無實、有些夸大其詞,難免讓普通學習者難以入門,十分頭痛,
以下主要基于回應式宣言和reactiveX來解釋回應式編程,所說觀點如有異議歡迎評論區討論指教,
回應式編程是什么?
是一款使用異步資料流編程的回應式編程思想,(from here)
Reactive Programming是基于觀察者模型的這是大家的共識,它提供了非阻塞、異步的特性,便于處理異步情景,從而避免回呼地獄和突破Future的局限性: 難以組合,(這個優點我并不認同,java8 的completeFuture已經有很好的改善了),
在reactiveX中,對好幾個語言提供了api庫,該庫擴展了觀察者模式,支持基于資料或事件的驅動,允許宣告式組合觀察者序列,將同步編程和異步編程抽象成統一,
異步編程和同步編程在代碼中的體現可以如下表體現,不同于傳統的pull型的,回應式編程通常采用push型的資料傳輸,由生產者控制消費速度,但當消費者消費速度不足時,也能反過來提示生產者降低生產速度(backPressure),backPressure將在下文闡述,
回應式編程通常帶有函式式的思想,但這是用來簡化面向物件語法臃腫性的,回應式編程的核心在于Reactive,只是帶有了部分的Functional的特性,更不是Functional Reactive Programming,這是完全不同的東西,
回應式宣言
回應式系統應該具有什么特性
當一個系統具有即時回應性(Responsive)、回彈性(Resilient)、彈性(Elastic)以及訊息驅動(Message Driven), 我們稱這樣的系統為反應式系統(Reactive System),
如圖所示,回應式編程的價值在于1. 易于撰寫維護(特別是異步編程) 2. 及時回應,
什么是及時回應? 不管是出了什么問題,或斷電、或網路抖動、或代碼bug,都能及時做出回應,提供足夠的可用性,
回應式宣言中將例外也看做一種訊息來簡化對錯誤的處理,其中錯誤可以簡單看成看做各種Exception,
什么是彈性? 回彈性?
彈性是指不同負載下,系統的吞吐量、回應性沒有什么區別,回應式通過伸縮演算法,使系統沒有資源爭用點和中央瓶頸,
回彈性是指當系統出現失敗時,例如斷電、硬體故障、資源耗盡等情況,通過復制、 遏制、 隔離以及委托來保證依然具有即時回應性,
訊息驅動還是事件驅動?
訊息時資料,事件是信號,訊息的包含的資訊量更豐富,
對于訊息驅動的系統,如果沒有訊息來,接受者異步非阻塞等待執行緒到來(休眠),
對于事件驅動的系統,常使用回呼的方法實作,
回應式宣言中推薦使用訊息驅動來設計,因為事件驅動的系統很難實作回彈性:
對于事件驅動系統,當處理程序已經就緒,監聽器已經設定好, 以便于回應結果并對結果進行變換時, 這些監聽器通常都將直接地處理成功或者失敗, 并向原始的客戶端報告執行結果,
(這些監聽器)回應組件的失敗, 以便于恢復它(指失敗的組件)的正常功能,而在另外一方面, 需要處理的是那些并沒有與短暫的客戶端請求捆綁在一起的, 但是影響了整個組件的健康狀況的失敗,
回應式編程相關討論
為什么使用觀察者模式
使用該模式將開發者從回呼地獄中解放出來,ReactiveX使用流來將異步、同步統一起來,并通過訂閱者來將各種操作組合起來,提高了代碼易讀性,
什么是回呼地獄? 其實就是當回呼函式需要組合時,常常會使代碼復雜度大大增加,代碼易讀性大大減少的一種現象,
ReactiveX的觀察者模式是十分靈活的,不僅僅支持push、還支持pull,
什么是背壓(backPressure)
其實背壓翻譯得不好,叫回壓更合適,知乎上有個背壓的解說我覺得說得特別好,背壓其實只是一種現象,但回應式編程中的backPressure其實是一種解決消費趕不上生產時的一種處理策略,有讓生產者慢點push的, 有直接丟棄的…
在資料流從上游生產者向下游消費者傳輸的程序中,上游生產速度大于下游消費速度,導致下游的 Buffer 溢位,這種現象就叫做 Backpressure ,
個人感想
在我還是學生的時候就常聽人說什么回應式編程、什么webflux,當時被各種新技術迷亂了眼睛的我胡亂的看了幾個相關介紹,再聽回應式編程被各種各樣的博客文章吹噓的多么多么好、多么多么先進,當時就覺得自己一定要學習,
作業后才發現實際的生產其實不需要多么牛逼先進的東西,大多時候線上系統穩定性才是最重要的,國內java8還是大行其道,好多人java8的特性還沒摸透,但依然在作業崗位上支撐起了一片天,
對于開發者,不要被互聯網上各式各樣的“技術營銷”騙了,在學習新技術前多想想是不是真的要學,什么代碼、什么技術、什么框架,都只是互聯網農民工手里的錘子罷了,不是越新越花哨的錘子就越好,能解決實際作業內容的就行,
有時候與其學著各種各樣的新技術新框架,不如陪家人看看電影、逛逛街,我們不是互聯網的螺絲釘,我們是人,只是恰逢資本主義時代,大多數人都被異化成了“工具人”,但我們都有自己的生活,自己的家人、朋友,每個人都不一樣,都有自己的人生,
總而言之,目前市場上回應式編程各種各樣,定義五花八門,優點論證也不夠充足,大家還是不要急著入場,
相關檔案
- http://reactivex.io/intro.html
- GitHub rxjava
- Reactive-Programming-一種技術-各自表述
- 回應式宣言
- 回應式宣言詞匯表
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/247210.html
標籤:其他
