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

2021-05-12 21:35:04 字數 1139 閱讀 5672

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

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

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

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

(注:本文**風格盡量遵循google c++ style guide )

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

tcpiothreadmanager:管理乙個或多個tcpiothread,其中乙個tcpiothtread作為主線程邏輯執行。

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

tcpiothread:io執行緒,通過commandlist也可作為工作執行緒使用,每個執行緒使用asio的io_service處理多個tcpsession。

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

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

外層還有兩個類:tcpserver和tcpclient,可以關聯到同乙個tcpiothreadmanager,以適應多服架構中某台伺服器既是tcp伺服器又是其它伺服器的客戶端的需求。

示例**:

客戶端也類似。

執行緒同步策略:

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

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

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

一種MMO伺服器框架

以下是一種單程序多執行緒的伺服器框架,loginserver是乙個登陸執行緒,處理使用者登陸和角色獲取。登陸成功後會連線chatserver和logicserver,聊天伺服器執行緒處理所有聊天資訊的 邏輯伺服器執行緒處理指令碼執行,日誌 戰鬥以及其他相關邏輯,邏輯伺服器執行緒可以多開,可以將使用者...

選定伺服器語言,構建伺服器框架

1 語言 python 2 python的安裝 我選擇的是 python 3.3.2.msi 3 搭建python的flask框架 1 框架選擇 我們選擇的是python中的flask框架,flask是乙個使用python編寫的輕量級web應用框架。基於werkzeug wsgi工具箱和jinja2...

構建高可用Linux伺服器筆記

一般來說物理cpu個數 核數就應該等於邏輯cpu的個數,如果不相等的話,則表示你的伺服器cpu支援超執行緒技術。網絡卡監控命令miit tool和iptraf 如果某指令碼要執行30分鐘,可以在crontab裡把指令碼間隔設為至少一小時來避免衝突。而比較糟的情況是可能該指令碼在執行週期內沒有完成,接...