一個大型的網落游戲服務器應該包含幾個模塊:網絡通訊,業務邏輯,數據存儲,守護監控(不是必須),其中業務邏輯可能根據具體需要,又划分為好幾個子模塊。
這里說的模塊可以指一個進程,或者一個線程方式存在,本質上就是一些類的封裝。
對於服務器的並發性,要么采用單進程多線程,要么采用多進程單線程的方式,說說兩種方式的優缺點:
一、單進程多線程的服務器設計模式,只有一個進程,但一個進程包好多個線程:
網絡通訊層,業務邏輯,數據存儲,分別在獨立的線程中,無守護進程。
優點:
1.數據共享和交換方便,使用全局變量或者單例就可以,數據存儲方便。
2.單進程,服務器框架結構相對簡單,編碼容易。
缺點:
1.所有功能只能在單個物理服務器上,不能做成分布式。
2.不方便監控各個線程狀態,容易死鎖
3.一個線程出錯,例如內存非法訪問,棧空間被破壞,那么服務器進程就退出,所有玩家掉線,影響大。
二、多進程單線程的服務器設計模式,多個進程,每個進程只有一個線程:
網路通訊,業務邏輯,數據存儲,守護進程,分別在不同的進程。
優點:
1.各個進程可以分布在不同的物理服務器上,可以做成分布式的服務器框架,例如可以將數據存儲單獨放到一個物理服務器上,供幾個區的服務器使用。將網絡通訊進程獨立出來,甚至可以做成導向服務器,實現跨服戰。
2.可以通過守護進程監控其它進程狀態,例如有進程死掉,馬上重啟該進程,或者某個進程cpu使用率接近100%(基本可以判斷是某個邏輯死循環了), 強制kill掉該進程,然后重啟。
3.單個服務器進程異常退出,只要不是網絡通訊進程(一般這個都會比較穩定,沒什么邏輯),那么就可以及時被守護進程重啟,不會造成玩家掉線,只會造成在1-2秒內,某個邏輯功能無法使用,甚至玩家都感覺不到。
4.服務器通過共享內存進行數據交換,那么如果其中一個服務器死掉,數據還在,可以保護用戶數據(當然多線程也可以使用共享內存)。
5.並發性相對多線程要高點。
缺點:
1.不方便使用互斥鎖,因為進程切換的時間片遠遠於線程切換,對於一個高並發服務器是無法允許這么高時間片的切換代價的。因此必須設計好服務器的框架,盡量避開使用鎖機制,但要保證數據不出錯。
2.多進程編程,在各個進程間會有很多通訊,跨服務器進程的異步消息較多,會讓服務器的編碼難度加大。
下面先按照一個游戲的功能,將服務器的功能分塊框架畫出來:


以上是一個游戲服務器最基礎的功能框架圖,接下來要做的就是設計服務器的框架了
Client<->GameServer<->DB 所有業務,數據集中處理
GameServe1 Client | DB GameServer2
玩家不斷增多->分線->程序自動或玩家手動選擇進入 缺點:運營到后期,隨着每條線玩家的減少, 互動大大減少。
注:在GateServer和CenterServer之間是有一條TCP連接的。而GameServer和LogServer之間的連接可以是UDP連接。這是有一個大概的圖,很多地方需要細化。
優點: (1)作為網絡通信的中轉站,負責維護將內網和外網隔離開,使外部無法直接訪問內部服務器,保障內網服務器的安全,一定程度上較少外掛的攻擊。 (2)網關服務器負責解析數據包、加解密、超時處理和一定邏輯處理,這樣可以提前過濾掉錯誤包和非法數據包。 (3)客戶端程序只需建立與網關服務器的連接即可進入游戲,無需與其它游戲服務器同時建立多條連接,節省了客戶端和服務器程序的網絡資源開銷。 (4)在玩家跳服務器時,不需要斷開與網關服務器的連接,玩家數據在不同游戲服務器間的切換是內網切換,切換工作瞬問完成,玩家幾乎察覺不到,這保證了游戲的流暢性和良好的用戶體驗。
缺點: 1.網關服務器成為高負載情況下的通訊瓶頸問題 2由於網關的單節點故障導致整組服務器無法對外提供服務的問題
解決:多網關技術。顧名思義,“多網關” 就是同時存在多個網關服務器,比如一組服務器可以配置三台GameGme。當負載較大時,可以通過增加網關服務器來增加網關的總體通訊流量,當一台網關服務器宕機時,它只會影響連接到本服務器的客戶端,其它客戶端不會受到任何影響。
DCServer:數據中心服務器。主要的功能是緩存玩家角色數據,保證角色數據能快速的讀取和保存 CenterServer:全局服務器/中心服務器,也叫WorldServer. 主要負責維持GameServer之間數據的轉發和數據廣播。另外一些游戲系統也可能會放到Center上處理,比如好友系統,公會系統。
改進:將網關服務器細化為LogingateServer和多個GameGateServer.
改進:甚至可以將登陸服務器細化拆分建角色,選擇角色服務器
下圖中每個方框表示一個獨立的進程APP組件,每個服務進程如果發生宕機會影響部分用戶,整體服務但不會全部中斷。在宕機進程重啟后,又可以並入整體,全部服務得以繼續。
7.另一個架構圖
