簡(jiǎn)介
一種面向數(shù)據(jù)流和變化傳播的編程范式??梢栽诰幊讨蟹奖愕乇磉_(dá)靜態(tài)或動(dòng)態(tài)的數(shù)據(jù)流,而相關(guān)的計(jì)算模型會(huì)自動(dòng)將變化的值通過數(shù)據(jù)流進(jìn)行傳播。最初是為了簡(jiǎn)化交互式用戶界面的創(chuàng)建和實(shí)時(shí)系統(tǒng)動(dòng)畫的繪制而提出來的一種方法,但它本質(zhì)上是一種通用的編程范式。
Reactive streams指的是一套規(guī)范,對(duì)于Java開發(fā)者來講,Reactive Streams就是一套API,使我們可以進(jìn)行Reactive programming。
Reactive模型最核心的是線程和消息管道。線程用于偵聽事件,消息管道用于線程之間通信不同的消息。
反應(yīng)式宣言

https://www.reactivemanifesto.org/zh-CN
描述了反應(yīng)式系統(tǒng)(reactive systems)應(yīng)該具備的四個(gè)關(guān)鍵屬性:Responsive(靈敏的)、Resilient(可故障恢復(fù)的)、Elastic(可伸縮的)、Message Driven(消息驅(qū)動(dòng)的)。
- Responsive(靈敏的):只要有可能,系統(tǒng)就會(huì)及時(shí)響應(yīng)。靈敏性是系統(tǒng)可用性的基石,除此之外,靈敏性也意味著系統(tǒng)的問題可以被快速地探測(cè)和解決。具有靈敏性的系統(tǒng)關(guān)注做出快速和一致的響應(yīng),提供可靠和一致的服務(wù)質(zhì)量。
- Resilient(可故障恢復(fù)的):在出現(xiàn)故障時(shí),系統(tǒng)仍然可以保持響應(yīng)。一個(gè)不具可恢復(fù)性的系統(tǒng)一旦出現(xiàn)故障,就會(huì)變得無法正常響應(yīng)。可恢復(fù)性可以通過復(fù)制、圍控、隔離和委派等方式實(shí)現(xiàn)。在可恢復(fù)性的系統(tǒng)中,故障被包含在每個(gè)組件中,各組件之間相互隔離,從而允許系統(tǒng)的某些部分出故障并且在不連累整個(gè)系統(tǒng)的前提下進(jìn)行恢復(fù)。
- Elastic(可伸縮的):在不同的工作負(fù)載下,系統(tǒng)保持響應(yīng)。系統(tǒng)可以根據(jù)輸入的工作負(fù)載,動(dòng)態(tài)地增加或減少系統(tǒng)使用的資源。這意味著系統(tǒng)在設(shè)計(jì)上可以通過分片、復(fù)制等途徑來動(dòng)態(tài)申請(qǐng)系統(tǒng)資源并進(jìn)行負(fù)載均衡,從而去中心化,避免節(jié)點(diǎn)瓶頸。
- Message Driven(消息驅(qū)動(dòng)的):反應(yīng)式系統(tǒng)依賴異步消息傳遞機(jī)制,從而在組件之間建立邊界,這些邊界可以保證組件之間的松耦合、隔離性、位置透明性,還提供了以消息的形式把故障委派出去的手段。
- Failures at messages:在 Reactive 編程中,我們通常需要處理流式的信息,我們最不希望看到的是突然拋出一個(gè)異常,然后處理過程終止了。理想的解決辦法是我們記下這個(gè)錯(cuò)誤,然后開始執(zhí)行某種重試或恢復(fù)的邏輯。在 Reactive Streams 中,異常是一等公民,異常不會(huì)被粗魯?shù)貟伋觯e(cuò)誤處理是正式建立在 Reactive Streams API 規(guī)范之內(nèi)的。
- Back-pressure:中文一般翻譯成“背壓”、“回壓”,意思是當(dāng)消費(fèi)端的消費(fèi)能力跟不上生產(chǎn)端的生產(chǎn)速度時(shí),消息流下游的消費(fèi)方對(duì)上游的生產(chǎn)方說:“我喝飽了,請(qǐng)你慢點(diǎn)”。在 Reactive 的世界里,我們希望下游的消費(fèi)方可以有某種機(jī)制按需請(qǐng)求一定數(shù)量的消息來消費(fèi)(這類似消息隊(duì)列中的 pull 的概念)。而不是上游把大量的消息一股腦灌給下游消費(fèi)方,然后阻塞式等待,throttling(節(jié)流) is done programmatically rather than blocking threads。
- Non-blocking:數(shù)據(jù)處理以一種非阻塞的方式被處理,線程不會(huì)因?yàn)榈却齽e的處理過程而卡住。這里可以對(duì)比有著 非阻塞事件循環(huán) 的Node.js Server(如一條高速公路)和傳統(tǒng)的Java多線程服務(wù)(如擁有紅綠燈的十字路口)