游戲服務器框架分析


一個大型的網落游戲服務器應該包含幾個模塊:網絡通訊,業務邏輯,數據存儲,守護監控(不是必須),其中業務邏輯可能根據具體需要,又划分為好幾個子模塊。

這里說的模塊可以指一個進程,或者一個線程方式存在,本質上就是一些類的封裝。

 

對於服務器的並發性,要么采用單進程多線程,要么采用多進程單線程的方式,說說兩種方式的優缺點:

 

一、單進程多線程的服務器設計模式,只有一個進程,但一個進程包好多個線程:

網絡通訊層,業務邏輯,數據存儲,分別在獨立的線程中,無守護進程。

優點:

1.數據共享和交換方便,使用全局變量或者單例就可以,數據存儲方便。

2.單進程,服務器框架結構相對簡單,編碼容易。

缺點:

1.所有功能只能在單個物理服務器上,不能做成分布式。

2.不方便監控各個線程狀態,容易死鎖

3.一個線程出錯,例如內存非法訪問,棧空間被破壞,那么服務器進程就退出,所有玩家掉線,影響大。

 

二、多進程單線程的服務器設計模式,多個進程,每個進程只有一個線程:

網路通訊,業務邏輯,數據存儲,守護進程,分別在不同的進程。

優點:

1.各個進程可以分布在不同的物理服務器上,可以做成分布式的服務器框架,例如可以將數據存儲單獨放到一個物理服務器上,供幾個區的服務器使用。將網絡通訊進程獨立出來,甚至可以做成導向服務器,實現跨服戰。

2.可以通過守護進程監控其它進程狀態,例如有進程死掉,馬上重啟該進程,或者某個進程cpu使用率接近100%(基本可以判斷是某個邏輯死循環了), 強制kill掉該進程,然后重啟。

3.單個服務器進程異常退出,只要不是網絡通訊進程(一般這個都會比較穩定,沒什么邏輯),那么就可以及時被守護進程重啟,不會造成玩家掉線,只會造成在1-2秒內,某個邏輯功能無法使用,甚至玩家都感覺不到。

4.服務器通過共享內存進行數據交換,那么如果其中一個服務器死掉,數據還在,可以保護用戶數據(當然多線程也可以使用共享內存)。

5.並發性相對多線程要高點。

缺點:

1.不方便使用互斥鎖,因為進程切換的時間片遠遠於線程切換,對於一個高並發服務器是無法允許這么高時間片的切換代價的。因此必須設計好服務器的框架,盡量避開使用鎖機制,但要保證數據不出錯。

2.多進程編程,在各個進程間會有很多通訊,跨服務器進程的異步消息較多,會讓服務器的編碼難度加大。

 

下面先按照一個游戲的功能,將服務器的功能分塊框架畫出來:

 

以上是一個游戲服務器最基礎的功能框架圖,接下來要做的就是設計服務器的框架了



1.    早期的MMORPG服務器結構
Client<->GameServer<->DB    所有業務,數據集中處理
優點:簡單,快速開發 缺點:     1.所有業務放在一起,系統負擔大大增加.一個bug可能導致整個服務器崩潰,造成所有玩家掉線甚至丟失等嚴重后果。     2.開服一剎那,所有玩家全部堆積在同一個新手村.->>>>卡,客戶端卡(同屏人數過多渲染/廣播風暴) 服務器卡(處理大量同場景消息/廣播風暴)
2.    中期-用戶分離集群式
                GameServe1 Client            |                    DB                 GameServer2
玩家不斷增多->分線->程序自動或玩家手動選擇進入 缺點:運營到后期,隨着每條線玩家的減少, 互動大大減少。
3.    中后期 數據分離集群式
按地圖划分服務器,當前主流     新手村問題:《天龍八部》提出了較好的解決方案,建立多個平行的新手村地圖,一主多副,開服時盡可能多的同時容納新用戶的涌入,高等級玩家從其它地圖回新手村只能到達主新手村。
4.    當前主流的網絡游戲架構

        注:在GateServer和CenterServer之間是有一條TCP連接的。而GameServer和LogServer之間的連接可以是UDP連接。這是有一個大概的圖,很多地方需要細化。
GateServer:網關服務器,AgentServer、ProxyServer
 優點:      (1)作為網絡通信的中轉站,負責維護將內網和外網隔離開,使外部無法直接訪問內部服務器,保障內網服務器的安全,一定程度上較少外掛的攻擊。     (2)網關服務器負責解析數據包、加解密、超時處理和一定邏輯處理,這樣可以提前過濾掉錯誤包和非法數據包。     (3)客戶端程序只需建立與網關服務器的連接即可進入游戲,無需與其它游戲服務器同時建立多條連接,節省了客戶端和服務器程序的網絡資源開銷。     (4)在玩家跳服務器時,不需要斷開與網關服務器的連接,玩家數據在不同游戲服務器間的切換是內網切換,切換工作瞬問完成,玩家幾乎察覺不到,這保證了游戲的流暢性和良好的用戶體驗。
   缺點:  1.網關服務器成為高負載情況下的通訊瓶頸問題 2由於網關的單節點故障導致整組服務器無法對外提供服務的問題
   解決:多網關技術。顧名思義,“多網關” 就是同時存在多個網關服務器,比如一組服務器可以配置三台GameGme。當負載較大時,可以通過增加網關服務器來增加網關的總體通訊流量,當一台網關服務器宕機時,它只會影響連接到本服務器的客戶端,其它客戶端不會受到任何影響。
DCServer:數據中心服務器。主要的功能是緩存玩家角色數據,保證角色數據能快速的讀取和保存 CenterServer:全局服務器/中心服務器,也叫WorldServer. 主要負責維持GameServer之間數據的轉發和數據廣播。另外一些游戲系統也可能會放到Center上處理,比如好友系統,公會系統。
    改進:將網關服務器細化為LogingateServer和多個GameGateServer.
5.    按業務分離式集群 由於網絡游戲存在很多的業務,如聊天,戰斗,行走,NPC等,可以將某些業務分到單獨的服務器上。這樣每個服務器的程序則會精簡很多。而且一些大流量業務的分離,可以有效的提高游戲服務器人數上限。
 
 
優點:       1.業務的分離使得每種服務器的程序變的簡單,這樣可以降低出錯的幾率。即使出錯,也不至於影響到每一個整個游戲的進行,而且通過快速啟動另一台備用服務器替換出錯的服務器。      2.業務的分離使得流量得到了分散,進而相應速度回得到提升 。      3.大部分業務都分離了成了單獨的服務器,所以可以動態的添加,從而提高人數上限。
改進:甚至可以將登陸服務器細化拆分建角色,選擇角色服務器
6.    一種簡單實用的網絡游戲服務器架構
下圖中每個方框表示一個獨立的進程APP組件,每個服務進程如果發生宕機會影響部分用戶,整體服務但不會全部中斷。在宕機進程重啟后,又可以並入整體,全部服務得以繼續。
 
gls:game login server,游戲登錄服務器,某種程序上,其不是核心組件,gls調用外部的接口,進行基本的用戶名密碼認證。此外需要實現很多附屬的功能:登錄排隊 (對開服非常有幫助),GM超級登錄通道(GM可以不排隊進入游戲),封測期間激活用戶控制,限制用戶登錄,控制客戶端版本等。 db:實質上是后台sql的大內存緩沖,隔離了數據庫操作,比較內存中的數據,只把改變的數據定時批量寫入sql。系統的算法,開發穩定性都要求非常高。 center:所有組件都要在這里注冊,在線玩家的session狀態都在這里集中存放,和各組件有心跳連接。所有對外的接口也全部通過這里。 角色入口:玩家登錄游戲后的選擇角色 gs:game server,最核心組件,同一地圖,所有游戲邏輯相關的功能,都在這里完成。 gate:建立和用戶的常鏈接,主要作sockt轉發,屏蔽惡意包,對gs進行保護。協議加密解密功能,一個gate共享多個gs,降低跳轉地圖連接不上的風險。 IM,關系,寄售:表示其它組件,負責對應的跨地圖發生全局的游戲邏輯。
7.另一個架構圖
    1-   這是一條WebService的管道,在用戶激活該區帳號,或者修改帳號密碼的時候,通過這條通道來插入和更新用戶的帳號信息。     2-   這也是一條WebService管道,用來獲取和控制用戶該該組內的角色信息,以及進行付費商城代幣之類的更新操作。     3-   這是一條本地的TCP/IP連接,這條連接主要用來進行服務器組在登陸服務器的注冊,以及登陸服務器驗證帳戶后,向用戶服務器注冊帳戶登陸信息,以及進行對已經登陸的帳戶角色信息進行操作(比如踢掉當前登陸的角色),還有服務器組的信息更新(當前在線玩家數量等)。     4-   這也是一條本地TCP/IP連接,這條連接用來對連接到GameServer的客戶端進行驗證,以及獲取角色數據信息,還有傳回GameServer上角色的數據信息改變。     5-   這條連接也是一條本地的TCP/IP連接,它用來進行公共信息服務器和數個游戲服務器間的交互,用來交換一些游戲世界級的信息(比如公會信息,跨服組隊信息,跨服聊天頻道等)。     6-   這里的兩條連接,想表達的意思是,UserServer和GameServer的Agent是可以互換使用的,也就是玩家進入組內之后,就不需要再切換 Agent。如果不怕亂套,也可以把登陸服務器的Agent也算上,這樣用戶整個過程里就不需要再更換Agent,減少重復連接的次數,也提高了穩定性。 (畢竟連接次數少了,也降低了連不上服務器的出現幾率) 在這個架構里面,GameServer實際上是一個游戲邏輯的綜合體,里面可以再去擴展成幾個不同的邏輯服務器,通過PublicServer進行公共數據交換。     UserServer實 際上扮演了一個ServerGroup的領頭羊的角色,它負責向LoginServer注冊和更新服務器組的信息(名字,當前人數),並且對Agent進 行調度,對選擇了該組的玩家提供一個用戶量最少的Agent。同時,它也兼了一個角色管理服務器的功能,發送給客戶端當前的角色列表,角色的創建,刪除, 選擇等管理操作,都是在這里進行的。而且,它還是一個用戶信息的驗證服務器,GameServer需要通過它來進行客戶端的合法性驗證,以及獲取玩家選擇 的角色數據信息。 采用這種架構的游戲,通常有以下表現。     1- 用戶必須激活一個大區,才能在大區內登陸自己的帳號。     2- 用戶啟動客戶端的時候,彈出一個登陸器,選擇大區。     3- 用戶啟動真正的客戶端的時候,一開始就是輸入帳號密碼。     4- 帳號驗證完成之后,進行區內的服務器選擇。     5- 服務器選擇完成之后,進入角色管理。同時,角色在不同的服務器里不能共享。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM