1. 程式人生 > >[紙上談兵]Java IO詳解(四) Reactor模式

[紙上談兵]Java IO詳解(四) Reactor模式

一、 Reactor中文解釋
Reactor模式翻譯成中文有的說是反應器,有的說是反應堆模式。
中文解釋
反應:因為事件所引發的迴應。名詞.
器: 容器, 例如:用來存放水之類的物體.
堆:   例如: 土堆.可以理解為土彙集到一起。
那麼
反應器:這個我個人理解,存放反應的容器
反應堆:反應彙集到一起.
通過上面的解釋來看,其實都差不多,個人理解叫反應器更合適一些,所以大家如果不太理解,可以先認為Reactor模式為反應器模式,即用一個容器來儲存反應的模式。記住這個再往下看.

二、服務端處理流程
當服務端成功接受連線後,一般要經歷以下流程: read, decode, compute, encode, send
read: 讀到客戶端傳送的資料。
decode: 對客戶端的資料進行解碼.例如:http請求定義的請求頭、請行、請求實體就是一個編碼協議,對於http請求所謂解碼也就是將請求的資料解析為請求頭、請求行、請求實體的過程.
compute: 這個過程可以理解為實際的業務處理
encode: 編碼,將服務端要響應給客戶端的資料進行編碼。編碼的意思就是將資料轉為服務端與客戶端約定的資料格式要求。如http響應.
send: 即將編碼好的資料傳送給客戶端。
"read, decode, compute, encode, send"每一個流程我們都代表一個事件

三、兩種請求處理體系
基於執行緒的處理體系與事件驅動的處理體系
定義:
基於執行緒:使用多執行緒來處理客戶端的請求,每當接收到一個請求,便開啟一個獨立的執行緒來處理.很明顯BIO是這種體系,而且也只能應用這種體系。
優點:直觀、簡單
缺點:僅適用於併發訪問量不大的場景,因為執行緒需要佔用一定的記憶體資源,且作業系統線上程之間的切換也需要一定的開銷,當執行緒數過多時顯然會降低web伺服器的效能.當執行緒在處理I/O操作,在等待輸入的這段時間執行緒處於空閒的狀態,同樣也會造成cpu資源的浪費

可以看一下流程(該圖與[服務端處理流程]中的內容一致,並非我個人畫的,從網上找的)

事件驅動:定義一系列的事件處理器來響應事件的發生,並且將服務端接受連線與對事件的處理分離.事件是一種狀態的改變.例如:java nio我個人理解就是基於事件驅動.

四、Reactor模式
Reactor設計模式,是在服務端使用的一種模式,一種基於事件驅動的設計模式。處理多個客戶端併發的向服務端請求服務的場景。
Reactor模式思想:分而治之+事件驅動
分而治之:
事件驅動:

五、Reactor模式與Java NIO 關係
我個人理解,JavaNIO中可以採用Reactor模式,也可以不採用。JavaNIO為採用Reactor提供了基礎支援。並非一提JavaNIO就是Reactor模式。

六、最簡易Reactor模式圖

詳解: TODO

七、多執行緒 Reactor模式圖

詳解: TODO

八、主Reactor與多個Reactor模式圖

詳解: TODO

參考:
https://www.jianshu.com/p/eef7ebe28673
https://www.2cto.com/kf/201611/566900.html
https://www.cnblogs.com/doit8791/p/7461479.html
http://ryanflyer.iteye.com/blog/1672876