從Jetty、Tomcat和Mina中提煉NIO構架網絡服務器的經典模式(一)

原創  從Jetty、Tomcat和Mina中提煉NIO構架網絡服務器的經典模式(一) 收藏 

如何正確使用NIO來構架網絡服務器一直是最近思考的一個問題,因而乎分析了一下Jetty、Tomcat和Mina有關NIO的源碼,發現大夥都基於相似的方式,我感受這應該算是NIO構架網絡服務器的經典模式,並基於這種模式寫了個小小網絡服務器,壓力測試了一下,效果還不錯。廢話很少說,先看看三者是如何使用NIO的。後端

Jetty Connector的實現服務器

先看看有關類圖:網絡

其中:多線程

SelectChannelConnector負責組裝各組件異步

SelectSet負責偵聽客戶端請求測試

SelectChannelEndPoint負責IO的讀和寫spa

HttpConnection負責邏輯處理.net

在整個服務端處理請求的過程能夠分爲三個階段,時序圖以下所示:線程

階段一:監聽並創建鏈接orm

這一過程主要是啓動一個線程負責accept新鏈接,監聽到後分配給相應的SelectSet,分配的策略就是輪詢。

階段二:監聽客戶端的請求

這一過程主要是啓動多個線程(線程數通常爲服務器CPU的個數),讓SelectSet監聽所管轄的channel隊列,每一個SelectSet維護一個Selector,這個Selector監聽隊列裏全部的channel,一旦有讀事件,從線程池裏拿線程去作處理請求

階段三:處理請求

這一過程就是每次客戶端請求的數據處理過程,值得注意的是爲了避免讓後端的業務處理阻礙Selector監聽新的請求,就多線程來分隔開監聽請求和處理請求兩個階段。

由此能夠大體總結出Jetty有關NIO使用的模式,以下圖所示:

最核心就是把三件不一樣的事情隔離開,並用不一樣規模的線程去處理,最大限度地利用NIO的異步和通知特性

相關文章
相關標籤/搜索