高性能網絡服務器框架設想(未完待續)

這個框架主要特點在於:1。跨平臺 2。高性能 3。多項服務整合。此框架將順利運行在Windows和Linux操作平臺上;網絡傳輸模塊皆使用各個平臺所提供的最高效的網絡IO模型;此外,使用此框架實現的服務器能夠同時提供多項整合的服務功能,比如同時提供http服務和ftp服務。
 
以下是我的一些關於設計方面的思考,比較亂。基本上想到什麼寫什麼。以後會繼續補充。感覺現在離整個設計框架成型還比較遠。
 
網絡服務器的編程方面,最重要的一個原則是邏輯應用層與網絡傳輸層分離。這可以帶來兩個好處:首先,便於編程,邏輯應用層的代碼只用管邏輯部分的問題,不用考慮數據傳輸層的實現。同樣,網絡傳輸層的代碼只用於管理具體網絡傳輸,不受上層任何功能的約束。許多事實證明當設計者專注於某一有限的領域時,可以編出更加高效的代碼。其次,便於模塊的替換,因爲層與層之間相對獨立,任何一層有所改動甚至被替換都不會影響到另一層的功能。一個比較典型的例子就是:網絡傳輸模塊在Windows平臺下面使用的是IOCP的機制,在Linux下面使用的是EPoll機制,在平臺遷移的過程中,網絡傳輸模塊可以用另一種機制被完全地替換而不會影響到邏輯應用層一絲一毫的代碼。(當然,實現這個功能前提是這兩個層之間定義了穩定而全面的接口,這個接口必須能夠包容兩個平臺上不同的網絡傳輸機制)
 
分層固然優點很多,但上下兩層的協作因爲彼此的分離增加了許多的難度。我將使用兩個任務隊列來保證上下兩層的交互,這個兩個隊列分別爲上行隊列和下行隊列,這兩條隊列不光是傳送網絡的接受和發送數據,一些邏輯層用來控制數據傳輸層以及數據傳輸層的反饋信息也是通過這兩條橋樑進行傳遞。此外由於考慮到中間傳輸的信息優先級有所不同,這兩個隊列必須實現爲具有優先級功能的結構。在這兩個優先級隊列的出口兩端必須各有一個分析任務,分配任務的線程。邏輯層和數據傳輸層各有一個線程池,任務分配線程將任務從隊列中取出分析後再從線程池中取出一個空閒線程加載運行。任務執行完畢,再從新放回線程池中。這樣這個架構中所具有的線程池的數目已經達到了3個:包括邏輯層一個,數據傳輸層中兩個(iocp一個以及框架管理的線程池一個),帶來的問題首先是編程上面比較麻煩,其次,我擔心3個線程池會不會導致性能下降。
 
邏輯層的構想是想讓網絡服務器能夠同時運行多個服務(比如作爲ftp服務器的同時也作爲http服務器運行)。一個服務可以被視爲一個功能模塊,用戶可以指定加載多個功能模塊,這些功能模塊可以在服務器初始化的時候被靜態加載,也可以在服務器運行的時候被動態加載或卸載。功能模塊自身與特定協議綁定,協議與服務器本身無關。同時如果能夠實現TCP,UDP混雜的iocp,那麼理論上大部分的基於TCP和UDP的服務都能夠通過此服務器框架提供。
 
一個連接一個線程的模式與線程池輪流處理連接的方式各有優缺點。前者相對比較簡單,但是線程數隨着連接數的增加而增加,資源使用量過大。後者在資源使用的方面優勢明顯,不過卻不具有前者相對比較簡單的邏輯。(事務處理涉及到的Session要在線程之間交接)
 
<未完待續>
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章