天天看點

《Scalable IO in Java》筆記

scalable io in java

<a href="http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf">http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf</a>

基本上所有的網絡處理程式都有以下基本的處理過程:

read request

decode request

process service

encode reply

send reply

classic service designs

《Scalable IO in Java》筆記

簡單的代碼實作:

《Scalable IO in Java》筆記
《Scalable IO in Java》筆記

對于每一個請求都分發給一個線程,每個線程中都獨自處理上面的流程。

這種模型由于io在阻塞時會一直等待,是以在使用者負載增加時,性能下降的非常快。

server導緻阻塞的原因:

1、serversocket的accept方法,阻塞等待client連接配接,直到client連接配接成功。

2、線程從socket inputstream讀入資料,會進入阻塞狀态,直到全部資料讀完。

3、線程向socket outputstream寫入資料,會阻塞直到全部資料寫完。

client導緻阻塞的原因:

1、client建立連接配接時會阻塞,直到連接配接成功。

2、線程從socket輸入流讀入資料,如果沒有足夠資料讀完會進入阻塞狀态,直到有資料或者讀到輸入流末尾。

3、線程從socket輸出流寫入資料,直到輸出所有資料。

4、socket.setsolinger()設定socket的延遲時間,當socket關閉時,會進入阻塞狀态,直到全部資料都發送完或者逾時。

改進:采用基于事件驅動的設計,當有事件觸發時,才會調用處理器進行資料處理。

basic reactor design

《Scalable IO in Java》筆記

 代碼實作:

《Scalable IO in Java》筆記
《Scalable IO in Java》筆記

這裡用到了reactor模式。

關于reactor模式的一些概念:

reactor:負責響應io事件,當檢測到一個新的事件,将其發送給相應的handler去處理。

handler:負責處理非阻塞的行為,辨別系統管理的資源;同時将handler與事件綁定。

reactor為單個線程,需要處理accept連接配接,同時發送請求到處理器中。

由于隻有單個線程,是以處理器中的業務需要能夠快速處理完。

改進:使用多線程處理業務邏輯。

worker thread pools

《Scalable IO in Java》筆記

 參考代碼:

《Scalable IO in Java》筆記
《Scalable IO in Java》筆記

将處理器的執行放入線程池,多線程進行業務處理。但reactor仍為單個線程。

繼續改進:對于多個cpu的機器,為充分利用系統資源,将reactor拆分為兩部分。

using multiple reactors

《Scalable IO in Java》筆記

參考代碼:

《Scalable IO in Java》筆記
《Scalable IO in Java》筆記

mainreactor負責監聽連接配接,accept連接配接給subreactor處理,為什麼要單獨分一個reactor來處理監聽呢?因為像tcp這樣需要經過3次握手才能建立連接配接,這個建立連接配接的過程也是要耗時間和資源的,單獨分一個reactor來處理,可以提高性能。

參考:

http://www.cnblogs.com/fxjwind/p/3363329.html

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

http://www.cnblogs.com/luxiaoxun/p/4331110.html