1. 程式人生 > >快速構建MMO伺服器框架(七)高併發TCP網路框架

快速構建MMO伺服器框架(七)高併發TCP網路框架

忙活了一個多星期,差不多把基於TCP的高併發連線網路架構測試穩定了。

目的:利用多執行緒把網路連線及資料包壓縮/解壓、加密/解密等等耗時的操作分流(asio對這些沒有原生的支援),順帶提供執行緒池框架。只對遊戲邏輯層暴露出單執行緒的外觀,隔離底層多執行緒的複雜度。

結構如下圖(未遵循什麼標準,將就著看吧):

TCPSessionHandler:暴露給邏輯層的類,內部負責通過TCPIOThreadManager跟掛載於某個執行緒的TCPSession進行互動,對上層遮蔽多執行緒細節。宣告如下:

 

NetMessageList:NetMessage定義為邏輯上有明確分界的網路訊息,一個或多個NetMessage組成NetMessageList。

TCPIOThreadManager:管理一個或多個TCPIOThread,其中一個TCPIOThtread作為主執行緒邏輯執行。

CommandList:執行緒間互動的命令佇列,也是整個框架中唯一的執行緒間同步方式,稍候詳述。

TCPIOThread:IO執行緒,通過CommandList也可作為工作執行緒使用,每個執行緒使用asio的io_service處理多個TCPSession。

NetMessageFilterInterface:網路訊息過濾器介面(上圖省略了Interface因為太長了),可以自定製,通常封裝組包、壓縮、加密等流程,以適應不同的邏輯層協議需求。

TCPSession:後臺網路連線,不區分服務端/客戶端,負責處理網路資料的傳送和接收。


外層還有兩個類:TCPServer和TCPClient,可以關聯到同一個TCPIOThreadManager,以適應多服架構中某臺伺服器既是TCP伺服器又是其它伺服器的客戶端的需求。

示例程式碼:

客戶端也類似。

執行緒同步策略:

上述執行緒間同步採用了Command模式,藉助了c++ 0x的function。CommandList的定義:


 

每個執行緒每隔一段時間就把要發往其它執行緒的Command批量傳送,因為list的splice只是幾個指標的操作,這個過程可以通過自旋鎖高效的完成(psydo code):

從TCPSessionHandler到TCPSession的NetMessageList的傳送,就是通過這套機制來實現,幾乎可以忽略執行緒鎖開銷。

剩下的問題:NetMessage內部變長緩衝用了vector來實現,動態記憶體分配可能會帶來效率上的隱患。實際應用如果確證,可以用記憶體池,但是多執行緒的高效記憶體池稍微複雜。相關思路改天再寫。