溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

(10)響應(yīng)式宣言、響應(yīng)式系統(tǒng)與響應(yīng)式編程——響應(yīng)式Spring的道法術(shù)器

發(fā)布時間:2020-06-15 16:23:00 來源:網(wǎng)絡(luò) 閱讀:9537 作者:享學(xué)IT 欄目:軟件技術(shù)

本系列文章索引《響應(yīng)式Spring的道法術(shù)器》
前情提要 響應(yīng)式編程 | 響應(yīng)式流

1.5 響應(yīng)式系統(tǒng)

1.5.1 響應(yīng)式宣言

關(guān)注“響應(yīng)式”的朋友不難搜索到關(guān)于“響應(yīng)式宣言”的介紹,先上圖:

(10)響應(yīng)式宣言、響應(yīng)式系統(tǒng)與響應(yīng)式編程——響應(yīng)式Spring的道法術(shù)器

這張圖凝聚了許多大神的智慧和經(jīng)驗(yàn),見官網(wǎng),中文版官網(wǎng),如果你認(rèn)可這個宣言的內(nèi)容,還可以簽下你的大名。雖然這些內(nèi)容多概念而少實(shí)戰(zhàn),讓人感覺是看教科書,但是字字千金,不時看一看都會有新的體會和收獲。

這也是新時代男朋友的行為準(zhǔn)則:

  • Responsive,要及時響應(yīng),24小時在線,不準(zhǔn)不接電話,微信回復(fù)時間要在5分鐘以內(nèi);
  • 如何做到Responsive呢,首先要Resilient,就是無論如何要有回應(yīng)。即使在玩LOL,也要接電話,哪怕正在聯(lián)合國演講,那么也要設(shè)置好“對不起寶貝兒,稍后打給你么么噠~”的自動回復(fù);
  • 做到Responsive的另一點(diǎn)是Elastic,要彈性應(yīng)對大量命令的到來。當(dāng)奉天承運(yùn)的圣旨過多時完不成怎么辦?對不起,不存在的,如果學(xué)不會三頭六臂,那就拉幾個好友幫忙;
  • 圣旨是通過異步方式傳遞的(Message Driven),給花店打電話訂花、到蛋糕店訂蛋糕等,別忘了購物車?yán)锏摹跋㈥?duì)列”要及時處理嘍~ 這些訂單都是具有一定格式和目的地的消息,然后異步等待快遞上門。

以響應(yīng)式系統(tǒng)方式構(gòu)建的系統(tǒng)更加靈活,松耦合和可擴(kuò)展。這使得它們更容易開發(fā),而且更加擁抱變化。及時地響應(yīng),以保證良好的用戶體驗(yàn)。系統(tǒng)錯誤和異常在所難免,當(dāng)異常出現(xiàn)時,要優(yōu)雅地處理之,不要任其蔓延、甚至到達(dá)用戶眼前。

關(guān)于宣言的具體內(nèi)容官網(wǎng)上很詳細(xì),就不多贅述了。

從落地方面,我們不難想到一些具體技術(shù)來支撐響應(yīng)式宣言的目標(biāo):

  • 比如如今比較火熱的云原生和DevOps的理念與實(shí)踐,以及更早一些的自動化運(yùn)維,都有助于讓系統(tǒng)更加Elastic,不過系統(tǒng)架構(gòu)的微服務(wù)化也是功不可沒;
  • 類似于Hystrix的熔斷器(Circuit Breaker)使得系統(tǒng)更加Resilient,因?yàn)樗軌蚣皶r將服務(wù)異常遏制在可控范圍內(nèi),避免雪崩;而類似kubernetes的云原生應(yīng)用能夠及時發(fā)現(xiàn)和重建系統(tǒng)中的異常服務(wù);
  • 而類似RabbitMQ、ActiveMQ這樣的消息隊(duì)列產(chǎn)品有助于構(gòu)建消息驅(qū)動的系統(tǒng),并發(fā)揮解耦、提速、廣播、削峰的作用;
  • 消息驅(qū)動有利于系統(tǒng)的彈性和可靠性,彈性和可靠性又使得系統(tǒng)的響應(yīng)更加及時;
  • 等等。

1.5.2 響應(yīng)式編程與響應(yīng)式系統(tǒng)

響應(yīng)式宣言是一組架構(gòu)與設(shè)計(jì)原則,符合這些原則的系統(tǒng)可以認(rèn)為是響應(yīng)式的系統(tǒng)。而響應(yīng)式系統(tǒng)與響應(yīng)式編程是不同層面的內(nèi)容。

看到網(wǎng)上有些文章在介紹RxJava、Reactor等響應(yīng)式編程技術(shù)的時候,會用響應(yīng)式宣言來引出話題,稍微有點(diǎn)驢唇對馬嘴的感覺(^_^)。響應(yīng)式系統(tǒng)(或響應(yīng)式宣言)與響應(yīng)式編程又是一對容易被揉在一起用的兩個術(shù)語(上一對容易被混用的術(shù)語是“響應(yīng)式編程RP”和“函數(shù)響應(yīng)式編程FRP”,見1.3.1 lambda與函數(shù)式),它們從關(guān)系上看雖然不如“雷鋒”和“雷峰塔”、Java和JavaScript那么遠(yuǎn),但并不存在必然的因果關(guān)系。

作為《響應(yīng)式宣言》的作者,Jonas Bonér和Viktor Klang解釋了響應(yīng)式編程與響應(yīng)式系統(tǒng)的區(qū)別與聯(lián)系(“Linux中國”上有翻譯版),其中也有對響應(yīng)式宣言四個原則的解讀,值得學(xué)習(xí)。我從中總結(jié)了一些二者的不同點(diǎn):

1)戰(zhàn)術(shù)與戰(zhàn)略的區(qū)別

響應(yīng)式編程是異步編程下的一個子集,是一種范式,有具體的開發(fā)庫,側(cè)重于由信息/數(shù)據(jù)流而不是命令式的控制流來推動邏輯的前進(jìn)。

響應(yīng)式宣言是一組設(shè)計(jì)原則,一種關(guān)于分布式環(huán)境下系統(tǒng)架構(gòu)與設(shè)計(jì)的思考方式,響應(yīng)式系統(tǒng)是符合這一架構(gòu)風(fēng)格的系統(tǒng)。

2)事件驅(qū)動與消息驅(qū)動的區(qū)別

響應(yīng)式編程——專注于短時間的數(shù)據(jù)流鏈條上的計(jì)算——因此傾向于事件驅(qū)動;而響應(yīng)式系統(tǒng)——關(guān)注于通過分布式系統(tǒng)的通信和協(xié)作所得到的彈性和可靠性——則是消息驅(qū)動的。

響應(yīng)式宣言中從定義上闡述了消息驅(qū)動與事件驅(qū)動的不同:

一條消息就是一則被送往一個明確目的地的數(shù)據(jù)。一個事件則是達(dá)到某個給定狀態(tài)的組件發(fā)出的一個信號。在一個消息驅(qū)動系統(tǒng)中,可尋址到的接收者等待消息的到來然后響應(yīng)它,否則保持休眠狀態(tài)。在一個事件驅(qū)動系統(tǒng)中,通知的監(jiān)聽者被綁定到消息源上,這樣當(dāng)消息被發(fā)出時它就會被調(diào)用。這意味著一個事件驅(qū)動系統(tǒng)專注于可尋址的事件源而消息驅(qū)動系統(tǒng)專注于可尋址的接收者。

3)組件范圍與系統(tǒng)范圍的區(qū)別

響應(yīng)式編程的“活動范圍”是在組件內(nèi)的,是一種管理組件或服務(wù)內(nèi)部邏輯和數(shù)據(jù)流的技術(shù),即使像1.4.2節(jié)中那樣數(shù)據(jù)流從服務(wù)B向服務(wù)A的流動,也并非跨服務(wù)的消息傳遞,只是基于API的調(diào)用而已。

響應(yīng)式系統(tǒng),強(qiáng)調(diào)組件/服務(wù)間的信息交流,并通過響應(yīng)式宣言提供了一種處理分布式系統(tǒng)彈性與可靠性的原則,因此是面向分布式的系統(tǒng)范圍的。

4)空間解耦能力的區(qū)別

正如前邊介紹到的異步調(diào)用方式那樣,事件驅(qū)動的響應(yīng)式編程側(cè)重于時間上的解耦,從而在技術(shù)層面提供了一種更高性能的并發(fā)方式。然而其范圍限定了它不易于實(shí)現(xiàn)空間上的解耦。

消息驅(qū)動的異步性使得響應(yīng)式系統(tǒng)既能夠在時間上解耦,還具有空間的解耦能力。服務(wù)間不僅可以通過消息隊(duì)列實(shí)現(xiàn)分布式協(xié)作,還可以根據(jù)負(fù)載實(shí)現(xiàn)單個服務(wù)的彈性伸縮,從而實(shí)現(xiàn)響應(yīng)式宣言中Elastic的能力。

5)總結(jié)

響應(yīng)式編程技術(shù)通常用于在單個節(jié)點(diǎn)或服務(wù)中對數(shù)據(jù)流進(jìn)行異步非阻塞的處理。當(dāng)有多個結(jié)點(diǎn)時,就需要認(rèn)真考量數(shù)據(jù)一致性(data consistency)、跨結(jié)點(diǎn)溝通(cross-node communication)、協(xié)調(diào)(coordination)、版本控制(versioning)、編排(orchestration)、錯誤管理(failure management)、關(guān)注與責(zé)任(concerns and responsibilities)分離等等的內(nèi)容——這些都是響應(yīng)式系統(tǒng)架構(gòu)要考慮的內(nèi)容。

類似的,Spring WebFlux是一種響應(yīng)式編程框架,用于開發(fā)響應(yīng)式應(yīng)用,而Spring Cloud不僅是更是一套適應(yīng)于當(dāng)今云原生環(huán)境下微服務(wù)架構(gòu)基礎(chǔ),更加接近響應(yīng)式宣言的目標(biāo)和響應(yīng)式系統(tǒng)的設(shè)計(jì)原則。

不過也應(yīng)該看到,也正是由于響應(yīng)式宣言中對現(xiàn)代系統(tǒng)的Responsive、Resilient、Elastic和Message Driven的要求,使得對響應(yīng)式編程技術(shù)的呼聲越來越高,顯然響應(yīng)式編程技術(shù)是構(gòu)建響應(yīng)式系統(tǒng)的合適工具之一。尤其是隨著面向響應(yīng)式宣言的響應(yīng)式流規(guī)范(Reactive Streams Specification)這一頂層設(shè)計(jì)的提出,類似Reactor、RxJava、Vert.x、Spring WebFlux等的響應(yīng)式編程技術(shù)在響應(yīng)式系統(tǒng)中必將發(fā)揮越來越大的作用。

關(guān)于響應(yīng)式系統(tǒng)的話題比較大,涉及到許多的理念、技術(shù)。本系列的文章仍主要聚焦于響應(yīng)式編程的范疇,并在最后討論響應(yīng)式編程在Spring Cloud中的應(yīng)用。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI