一種網絡遊戲服務器架構

網絡遊戲的結構分爲客戶端與服務器端,客戶端採用2D繪製引擎或者3D繪製引擎繪製遊戲世界的實時畫面,服務器端則負責響應所有客戶端的連接請求和遊戲邏輯處理,並控制所有客戶端的遊戲畫面繪製。客戶端與服務器通過網絡數據包交互完成每一步遊戲邏輯,由於遊戲邏輯是由服務器負責處理的,要保證面對海量用戶登錄時,遊戲具有良好的流暢性和用戶體驗,優秀的服務器架構起到了關鍵的作用。

服務器架構設計

1.1  服務器架構分類 
服務器組的架構一般分爲兩種:第一種是帶網關服務器的服務器架構;第二種是不帶網關服務器的服務器架構,這兩種方案各有利弊。在給出服務器架構設計之前,先對這兩種設計方案進行詳細的探討。所謂網關服務器,其實是Gate服務器,比如LoginGateGameGate等。網關服務器的主要職責是將客戶端和遊戲服務器隔離,客戶端程序直接與這些網關服務器通信,並不需要知道具體的遊戲服務器內部架構,包括它們的IP、端口、網絡通信模型(完成端口或Epoll)等。客戶端只與網關服務器相連,通過網關服務器轉發數據包間接地與遊戲服務器交互。同樣地,遊戲服務器也不直接和客戶端通信,發給客戶端的協議都通過網關服務器進行轉發。

1.2  服務器架構設計 
根據網絡遊戲的規模和設計的不同,每組服務器中服務器種類和數量是不盡相同的。本文設計出的帶網關服務器的服務器組架構如圖1所示。

wKioL1kien3Txj9gAABMriaFY20228.jpg-wh_50


本文將服務器設計成帶網關服務器的架構,雖然加大了服務器的設計複雜度,但卻帶來了以下幾點好處:
1)作爲網絡通信的中轉站,負責維護將內網和外網隔離開,使外部無法直接訪問內部服務器,保障內網服務器的安全,一定程度上較少外掛的***。 
2)網關服務器負責解析數據包、加解密、超時處理和一定邏輯處理,這樣可以提前過濾掉錯誤包和非法數據包。
3)客戶端程序只需建立與網關服務器的連接即可進入遊戲,無需與其它遊戲服務器同時建立多條連接,節省了客戶端和服務器程序的網絡資源開銷。 
4)在玩家跳服務器時,比如大場景切換,不需要斷開與網關服務器的連接,玩家數據在不同遊戲服務器間的切換是內網切換,切換工作瞬間完成,玩家幾乎察覺不到,這保證了遊戲的流暢性和良好的用戶體驗。 
在享受網關服務器帶來上述好處的同時,還需注意以下可能導致負面效果的兩個情況:如何避免網關服務器成爲高負載情況下的通訊瓶頸問題以及由於網關的單節點故障導致整組服務器無法對外提供服務的問題。上述兩個問題可以採用多網關技術加以解決。顧名思義,多網關就是同時存在多個網關服務器,比如一組服務器可以配置三臺GameGate。當負載較大時,可以通過增加網關服務器來增加網關的總體通訊流量,當一臺網關服務器宕機時,它只會影響連接到本服務器的客戶端,其它客戶端不會受到任何影響。 
從圖1的服務器架構圖可以看出,一組服務器包括LoginGateLoginServerGameGateGameServerDBServerMServer等多種服務器。LoginGateGameGate就是網關服務器,一般一組服務器會配置3GameGate,因爲穩定性對於網絡遊戲運營來說是至關重要的,而服務器宕機等突發事件是遊戲運營中所面臨的潛在風險,配置多臺服務器可以有效地降低單個服務器宕機帶來的風險。另外,配置多臺網關服務器也是進行負載均衡的有效手段之一。下面將對各種服務器的主要功能和彼此之間的數據交互做詳細解釋。
1LoginGate 
LoginGate
主要負責在玩家登錄時維護客戶端與LoginServer之間的網絡連接與通訊,對LoginServer和客戶端的通信數據進行加解密、校驗。
2LoginServer 
LoginServer
主要功能是驗證玩家的賬號是否合法,只有通過驗證的賬號才能登錄遊戲。這樣可以過濾掉一部分不合法的帳號,或者一些惡意登陸信息。從架構圖可以看出, DBServerGameServer會連接LoginServer。玩家登錄基本流程是,客戶端發送賬號和密碼到LoginServer驗證,如果驗證通過,LoginServer會給玩家分配一個SessionKeyLoginServer會把這個SessionKey發送給客戶端、DBServerGameServer,在後續的選擇角色以後進入遊戲過程中,DBServerGameServer將驗證SessionKey合法性,這裏是內網驗證,GMServerDBserver中取出SessionKey,與客戶端帶來的Sessionkey進行對比,如果和客戶端攜帶的SessionKey不一致,將無法成功獲取到角色或者進入遊戲。
3GameGate 
GameGate(GG)
主要負責在用戶遊戲過程中負責維持GS與客戶端之間的網絡連接和通訊,對GS和客戶端的通信數據進行加解密和校驗,對客戶端發往GS的用戶數據進行解析,過濾錯誤包,對客戶端發來的一些協議作簡單的邏輯處理,其中包括遊戲邏輯中的一些超時判斷。在用戶選擇角色過程中負責維持DBServer與客戶端之間的網絡連接和通訊,對DBServer和客戶端的通信數據進行加解密和校驗,對客戶端發往DBServer的用戶數據做簡單的分析。維持客戶端與MServer之間的網絡連接與通訊、加解密、數據轉發和簡單的邏輯處理等。
4GameServer 
GameServer(GS)
主要負責遊戲邏輯處理。網絡遊戲有龐大世界觀背景,絢麗激烈的陣營對抗以及完備的裝備和技能體系。目前,網絡遊戲主要包括任務系統、聲望系統、玩家PK、寵物系統、擺攤系統、行會系統、排名系統、副本系統、生產系統和寶石系統等。從軟件架構角度來看,這些系統可以看着GS的子系統或模塊,它們共同處理整個遊戲世界邏輯的運算。遊戲邏輯包括角色進入與退出遊戲、跳GS以及各種邏輯動作(比如行走、跑動、說話和***等) 
由於整個遊戲世界有許多遊戲場景,在該架構中一組服務器有3GS共同負責遊戲邏輯處理,每臺遊戲服務器負責一部分地圖的處理,這樣不僅降低了單臺服務器的負載,而且降低了GS宕機帶來的風險。玩家角色信息裏會保持玩家上次退出遊戲時的地圖編號和所在GS編號,這樣玩家再次登錄時,會進入到上次退出時的GS 
上面提到過,在驗證賬號之後,LoginServer會把這個SessionKey 發給GS,當玩家選擇角色登錄GS時,會把SessionKey一起發給GS,這時GS會驗證SessionKey是否與其保存的相一致,不一致的話GS會拒絕玩家進入遊戲。MServer的主要負責GS之間的數據轉發以及數據廣播,另外,一些系統也可以放到MServer上,這樣也可以減輕GS的運算壓力。
5DBServer 
DBServer
主要的功能是緩存玩家角色數據,保證角色數據能快速的讀取和保存。由於角色數據量是比較大的,包括玩家的等級、經驗、生命值、魔法值、裝備、技能、好友、公會等。如果每次GS獲取角色數據都去讀數據庫,效率必然非常低下,用DBServer緩存角色數據之後,極大地提高了數據請求的響應速度。
LoginServer
會在玩家選組時把SessionKey發給DBServer,當玩家發送獲取角色信息協議時會帶上這個SessionKey,如果跟DBServer保存的SessionKey不一致,則DBServer會認爲玩家不是合法用戶,獲取角色協議將會失敗。另外,玩家選取角色正式進入遊戲時,GS會給DBServer發送攜帶SessionKey的獲取角色信息協議,這時DBServer同樣會驗證SessionKey的合法性。總之,只有客戶端、DBServerGS所保存的SessionKey一致,才能保證協議收到成功反饋。 
DBServer通訊的服務器主要有GGGSLoginServerDBServerGG交互的協議主要包括列角色、創建角色、刪除角色、恢復角色等,DBServerGS交互的協議包括讀取角色數據、保存角色數據和跳服務器等,DBServerLoginServer交互的協議主要是用戶登錄協議,這時候會給DBServer發送SessionKey 
6MServer 
每一個組有一臺MServer,主要負責維持3GS之間數據的轉發和數據廣播。另外一些遊戲系統也可能會放到MServer上處理,比如行會系統。 
1.3 
服務器交互的主要流程 
下面給出服務器之間數據通訊的主要流程從這些流程能看出各種服務器之間是如何數據交互和協同工作的。

wKiom1kiepTxCy3tAAA91wDWq_w476.jpg-wh_502的流程說明了,在選角色過程中,客戶端會把攜帶遊戲賬號和SessionKey的選角色協議發給GGGG做一些簡單處理之後轉發給DBServerDBServer要驗證SessionKey的合法性,驗證通過之後,DBServer會從角色信息緩衝區裏取出該賬戶的所有角色信息發給客戶端。這個過程在客戶端的表現是,當選擇好服務器組之後,客戶端會直接顯示該賬號下的所有角色,之後就可以選擇角色進入遊戲了。

wKioL1kieqTxh9PgAABBIN4azOY063.jpg-wh_503的流程說明了,在玩家選角色正式進入遊戲時,客戶端會把攜帶遊戲賬號、角色IDSessionKey的登錄協議發給GGGG做一些簡單處理之後轉發給GSGS會驗證SessionKey的合法性,驗證通過之後,GS會把驗證通過的結果發給客戶端,同時GSDBServer發獲取角色數據的協議,這些角色數據是一個玩家所有的遊戲數據,包括裝備、技能等等。

wKioL1kierKwgqJAAAB4tuCFrUI877.jpg-wh_504的流程說明了,在玩家遊戲過程,客戶端把邏輯協議(包括走、說話、跑、使用技能等)發給GGGG完成加解密和簡單邏輯處理之後轉發給GSGS負責這些協議的主要邏輯處理。 

總結:這只是一種簡單的構架,真實的遊戲開發過程中,要比這複雜的多,但這個架構具有總體性,目前的遊戲服務器架構都是在此基礎上進行的一些擴展。比如還可以增加單獨的AI服務器,聊天服務器,戰鬥服務器,跨服戰服務器等等。這些服務器之間的組織,通信方式都可以參考這個方案。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章