基於NIO的伺服器模型

2022-09-04 03:45:10 字數 859 閱讀 7118

最簡單伺服器模型是thread-per-connection,即每個客戶端連線對於乙個專屬的工作執行緒,工作執行緒等待客戶端傳送資料、接收處理資料、返回響應資料然後繼續等待新的資料的到來,這種模型能夠保證很好的響應速度,但如果有大量併發連線會導致大量的工作執行緒,而且這些執行緒浪費了很多時間等待新資料,這些導致了這種伺服器模型不適合高併發的情況。

如果伺服器需要應對大量但可能並不實時活躍的連線,那麼thread-on-event模型就比較適合。這種模型工作執行緒獨立於客戶端連線,只用來處理特定的事件,例如當有資料到來時(data received event),工作執行緒在應用級別處理這些資料提供或者啟動服務。這種模型需要socket io使用非阻塞的方式,同時需要事件監測機制。這種模型被稱為訊息驅動模型(reactor pattern)。

基於nio的訊息驅動模型:

dispatcher維護乙個selector,客戶端連線註冊到selector,當有資料可讀可寫時,dispatcher觸發響應的事件。

通常訊息驅動模型伺服器的元件:

acceptor主要負責接收新的連線請求並將其註冊到dispather中。其中維護了serversocketchannel,通常採用阻塞的方式。也可以用來實現連線統計,負載均衡。

dispatcher,因為不同平台的selector實現差異比較大,通常會使用多個(大部分伺服器用了兩個),用乙個dispatcherpool維護,主要負責檢測socketchannel的註冊、以及讀寫事件。需要注意selector的key set不是執行緒安全的,不同執行緒中更新、讀取需要同步。

dispatcher-level eventhandler 用來處理讀寫事件,讀取資料加入到connection的read/write queue中供後續處理。

該模型的簡單實現

高擴充套件的基於NIO的伺服器架構(二)

接上文高擴充套件的基於nio的伺服器架構 reactor模式 如下圖所示,將不同事件的檢測分離開,當一種事件發生時乙個事件處理器eventhandler將通知與該事件處理相對應的專用工作執行緒 採用這種架構,連線的通道不得不註冊在乙個selector上。這樣才能通過呼叫register方法使通道有效...

伺服器模型

伺服器模型 1 迴圈伺服器模型 tcp 迴圈伺服器 udp 迴圈伺服器 2 併發伺服器 tcp 併發伺服器 父子程序實現併發伺服器 父親程序 接收請求。accept 兒子程序 處理具體客戶端需求。send recv 注意點 殭屍程序,父親活著,兒子死亡,父親沒有為兒子程序收屍,會產生殭屍程序。避免殭...

伺服器模型

在使用socket進行網路程式設計時,首先要選擇乙個合適的伺服器模型是很重要的。在網路程式裡,通常都是乙個伺服器服務多個客戶機,為了處理多個客戶機的請求,伺服器端的程式有不同的處理方式。迭代模型算是最早期的伺服器模型,其核心實現是每來乙個使用者,然後為這個使用者服務到底,過程中不接受任何新的使用者請...