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

簡單的代碼實作:
對于每一個請求都分發給一個線程,每個線程中都獨自處理上面的流程。
這種模型由于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
代碼實作:
這裡用到了reactor模式。
關于reactor模式的一些概念:
reactor:負責響應io事件,當檢測到一個新的事件,将其發送給相應的handler去處理。
handler:負責處理非阻塞的行為,辨別系統管理的資源;同時将handler與事件綁定。
reactor為單個線程,需要處理accept連接配接,同時發送請求到處理器中。
由于隻有單個線程,是以處理器中的業務需要能夠快速處理完。
改進:使用多線程處理業務邏輯。
worker thread pools
參考代碼:
将處理器的執行放入線程池,多線程進行業務處理。但reactor仍為單個線程。
繼續改進:對于多個cpu的機器,為充分利用系統資源,将reactor拆分為兩部分。
using multiple reactors
參考代碼:
mainreactor負責監聽連接配接,accept連接配接給subreactor處理,為什麼要單獨分一個reactor來處理監聽呢?因為像tcp這樣需要經過3次握手才能建立連接配接,這個建立連接配接的過程也是要耗時間和資源的,單獨分一個reactor來處理,可以提高性能。
參考:
http://www.cnblogs.com/fxjwind/p/3363329.html
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
http://www.cnblogs.com/luxiaoxun/p/4331110.html