天天看點

java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型

同步I/O模型的弊端

===>每一個線程的建立都會消耗服務端記憶體,當大量請求進來,會耗盡記憶體,導緻服務當機

僞異步I/O的弊端分析

===>當對Socket的輸入流進行讀取操作的時候,它會一直阻塞下去,知道發生如下三件事情

(1)有資料可讀

(2)可用資料已經讀取完畢

(3)發生空指針或者I/O異常

===>這意味着當對方發送請求或應答消息比較緩慢,或者網絡傳輸比較慢時候,讀取輸入流的一方的通信線程将被長時間阻塞。在阻塞期間,其他接入的消息隻能在消息隊列中排隊。

===>僞異步I/O實際上僅僅隻是對之前I/O線程模型的一個簡單優化,它無法從根本上解決同步I/O導緻的通信線程阻塞問題,下面我們簡單分析下如果通信對方傳回應答時間過長,會引起的級聯鼓掌。

(1)服務端處理緩慢,傳回應答消息耗費60s,平時隻需要10ms

(2)采用僞異步I/O線程正在讀取故障服務節點的響應,由于讀取輸入流是阻塞的。是以,它将會被同步阻塞60s

(3)假如所有的可用線程都被故障伺服器阻塞,那後續所有的I/O消息都将在隊列中排隊。

(4)由于線程池采用阻塞隊列實作,當隊列積滿之後,後續入隊列的操作将被阻塞

(5)由于前端隻有一個Accptor線程接收用戶端接入,它被阻塞線上程池的同步阻塞隊列之後,新的用戶端請求消息将被拒絕,用戶端會發生大量的連接配接逾時。

(6)由于幾乎所有的連結都逾時,調用者會認為系統崩潰,無法接收新的請求消息。

【一】同步阻塞I/O服務端通信模型

java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型

第一:socket同步阻塞伺服器的啟動

java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型
java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型

View Code

第二:soket伺服器接收到請求的處理類

java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型
java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型

第三:向socket伺服器發送請求

java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型
java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型

【二】同步阻塞I/O服務端通信模型構造的僞異步通信模型

java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型

一:僞異步socket服務端啟動(就是在同步的基礎上使用了線程池)

java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型
java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型

二:僞異步socket服務處理socket請求的線程池

java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型
java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型

三:處理請求的Handler類(線程類)

java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型
java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型

四:用戶端發送請求

java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型
java的nio之:java的bio流下實作的socket伺服器同步阻塞模型和socket的僞異步的socket伺服器的通信模型