1. 程式人生 > >一種高效能網路遊戲的的架構設計

一種高效能網路遊戲的的架構設計

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

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

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

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

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

圖3的流程說明了,在玩家選角色正式進入遊戲時,客戶端會把攜帶遊戲賬號、角色ID和SessionKey的登入協議發給GG,GG做一些簡單處理之後轉發給GS。GS會驗證SessionKey的合法性,驗證通過之後,GS會把驗證通過的結果發給客戶端,同時GS給DBServer發獲取角色資料的協議,這些角色資料是一個玩家所有的遊戲資料,包括裝備、技能等等。

圖4的流程說明了,在玩家遊戲過程,客戶端把邏輯協議(包括走、說話、跑、使用技能等)發給GG,GG完成加解密和簡單邏輯處理之後轉發給GS,GS負責這些協議的主要
邏輯處理。 
2  總結 
網路遊戲伺服器的架構設計已經成為當前網路遊戲研究領域的熱點,因為高效能伺服器架構設計是一款網路遊戲成功的關鍵。本文從實際應用出發,提出了一種高效能的伺服器架構設計解決方案,並且詳細探討了各種伺服器的功能,本文的最後給出了幾個伺服器之間資料通訊的關鍵流程,以圖文並茂的方式解釋各個伺服器是如何協同工作的。