摘要:大型多人在線角色扮演游戲(Massively Multiplayer Online Role Playing Game,以下簡稱MMORPG)一般采用客戶端/服務(wù)器結(jié)構(gòu),服務(wù)器架構(gòu)設(shè)計是成功開發(fā)一款MMORPG的關(guān)鍵,本文對高性能MMORPG服務(wù)器架構(gòu)設(shè)計進行了深入地研究。一個MMORPG一般會開設(shè)多個區(qū)供玩家進行游戲,一個區(qū)會包括一組服務(wù)器,本文設(shè)計出的服務(wù)器組架構(gòu)包括LoginServer、WorldServer、WorldGameServer、GameServer和DBServer等服務(wù)器。
關(guān)鍵詞:MMORPG;服務(wù)器;架構(gòu);高性能
中圖分類號:TP311.52 文獻標識碼:A 文章編號:1007-9599 (2012) 09-0000-02
一、前言
MMORPG的結(jié)構(gòu)分為客戶端與服務(wù)器端,客戶端展現(xiàn)游戲?qū)崟r畫面,并且將玩家在客戶端邏輯請求的操作發(fā)往服務(wù)器端,服務(wù)器端負責響應(yīng)所有客戶端的連接請求,處理客戶段的邏輯請求,并將結(jié)果返回給客戶端以使游戲在客戶端繼續(xù)進行??蛻舳伺c服務(wù)器通過網(wǎng)絡(luò)數(shù)據(jù)包交互和完成每一個游戲邏輯,游戲絕大部分邏輯都是在服務(wù)器端負責處理,為了保證海量用戶同時進行游戲,并且體驗良好,優(yōu)秀服務(wù)器架構(gòu)起到了非常關(guān)鍵的作用。
二、服務(wù)器架構(gòu)設(shè)計
(一)服務(wù)器架構(gòu)不同分類
服務(wù)器組架構(gòu)有多種,其中使用最廣泛的有兩種:一種是帶路由服務(wù)器的服務(wù)器架構(gòu);另一種是不帶路由服務(wù)器的服務(wù)器架構(gòu),兩種方案各有利弊。本文設(shè)計出了另一種新型的設(shè)計方案:一個世界服務(wù)器作為整個服務(wù)器組的中心,一切請求通過中心服務(wù)器轉(zhuǎn)發(fā),呈星形結(jié)構(gòu)。每個其他服務(wù)器只負責處理自己的邏輯。這種方案做到了每個服務(wù)器各司其職,職責清晰,并且根據(jù)游戲玩家數(shù)量的改變來動態(tài)的增減服務(wù)器的數(shù)量。
(二)服務(wù)器架構(gòu)設(shè)計
根據(jù)MMORPG規(guī)模大小和設(shè)計不同,每組服務(wù)器中服務(wù)器種類和數(shù)量也是不同的。本文中的設(shè)計是星形結(jié)構(gòu)服務(wù)器組架構(gòu),如圖1所示。
圖1 星形服務(wù)器架構(gòu)設(shè)計
星形服務(wù)器架構(gòu)設(shè)計雖然增加了服務(wù)器設(shè)計的難度,并且服務(wù)器的數(shù)量也相應(yīng)的增加了,但卻帶來了其它架構(gòu)所不具有的優(yōu)點,具體優(yōu)點為:
1.WorldServer所有其他服務(wù)器的管理者,可以對所有其他服務(wù)器進行調(diào)度,使得整體結(jié)構(gòu)非常清晰,各個服務(wù)器各司其職,也利于開發(fā)過程中的工作劃分。
2.WorldServer只負責調(diào)度、數(shù)據(jù)包數(shù)據(jù)解析、數(shù)據(jù)加解密、數(shù)據(jù)超時處理,不做任何邏輯處理,這樣主要是可以過濾掉錯誤和非法的數(shù)據(jù)包,提高其他服務(wù)器的處理數(shù)據(jù)的效率。
3.GameServer可以隨時增加,WorldGameServer和GameServer中的復雜邏輯可以隨時提取出來做成單獨服務(wù)器,有效提高效率和擴展性。
星形架構(gòu)雖然有上面的三個優(yōu)點,但是還是需注意兩個可能導致負面效果的情況:一個是如何避免中心管理者身份WorldServer的高負載瓶頸問題,第二個是由于不同的問題導致的WorldServer出現(xiàn)故障,導致整組服務(wù)器癱瘓,無法對外提供服務(wù)問題。上述兩個問題可以采用Nginx負載均衡技術(shù)加以解決。Nginx負載均衡技術(shù)就是同時存在多個WorldServer,比如一組服務(wù)器可以配置兩臺或更多WorldServer。通過對Nginx進行簡單的配置,就可以達到實時的同步兩臺或多臺WorldServer,當某一臺負載較大或者宕機時,自動切換到正常運行的WorldServer,從而保證所有客戶端都不會掉線。從圖1的服務(wù)器架構(gòu)圖可以看出,一組服務(wù)器包括LoginServer、WorldServer、WorldGameServer、DBServer和多個GameServer等多種服務(wù)器。一組服務(wù)器一般至少配置兩臺WorldServer和一臺Nginx服務(wù)器,因為對于MMORPG運營來說穩(wěn)定性是至關(guān)重要的。在游戲運營中所面臨的潛在的風險是服務(wù)器宕機等突發(fā)事件。需配置兩臺WorldServer和一臺Nginx服務(wù)器可以組成一個負載均衡,可以有效的防治服務(wù)器宕機帶來的風險。下面是對各種服務(wù)器主要功能和服務(wù)器之間數(shù)據(jù)交互的詳細解釋。
(1)LoginServer
LoginServer主要功能是對玩家賬號是否合法進行校驗,只有通過校驗的賬號才能成功登錄游戲界面,運行游戲程序。從架構(gòu)圖可以看出,LoginServer會連接WorldServer和AccoutDB。AccoutDB玩家賬號信息數(shù)據(jù)庫,數(shù)據(jù)庫中存放玩家的具體信息,比如賬號和密碼等。玩家登錄游戲的基本流程是,客戶端填寫好賬號和密碼,然后將賬號和密碼發(fā)送到LoginServer服務(wù)器驗證賬號和密碼,如果驗證通過,LoginServer服務(wù)器將發(fā)送請求給WorldServer,WorldServer同時生成一個SessionKey,之后WorldServer將此次登陸的SessionKey分別發(fā)給客戶端、DBServer、WorldGameServer和其它GameServer。等客戶端選擇角色以后進入游戲過程,GameServer和WorldGameServer驗證SessionKey的合法性,如果和客戶端攜帶的SessionKey不一致,就無法成功的獲取到客戶端選擇的角色,也不能進入游戲。
(2)WorldServer服務(wù)器
WorldServer(WS)主要負責在用戶游戲過程中管理WorldGameServer、DBServer和各個GameServer。轉(zhuǎn)發(fā)他們和客戶端之間的數(shù)據(jù)包。對數(shù)據(jù)包進行解析,過濾錯誤包,進行加解密,并不對游戲邏輯做任何處理。
(3)WorldGameServer服務(wù)器
WorldGameServer(WGS)主要負責全局性的游戲邏輯處理。MMORPG中一般會有幫會系統(tǒng)、家族系統(tǒng)、排行系統(tǒng)等全局性的邏輯系統(tǒng)。這些系統(tǒng)不但是全局性的,而且是和地圖相關(guān)的,因此單獨設(shè)計一個服務(wù)器來處理。
(4)GameServer服務(wù)器
GameServer(GS)服務(wù)器主要功能是處理游戲邏輯。MMORPG有龐大背景,豐富的色彩效果,激烈的對抗陣營,完備的技能體系和裝備。目前,MMORPG主要包括聲望系統(tǒng)、寵物系統(tǒng)、戰(zhàn)斗系統(tǒng)、擺攤系統(tǒng)、任務(wù)系統(tǒng)、生產(chǎn)系統(tǒng)、副本系統(tǒng)、寶石系統(tǒng)和裝備系統(tǒng)等。從軟件架構(gòu)角度看,所有這些系統(tǒng)都可以看作是GS的子系統(tǒng)或模塊,它們共同處理整個游戲世界邏輯的運算。游戲邏輯包括游戲角色進入游戲、退出游戲、切換地圖、切換游戲服務(wù)器以及各種邏輯動作(比如行走、跑動、購買道具、使用技能、聊天和攻擊等)。由于一個完整的游戲世界會有許多游戲場景,在該架構(gòu)體系中通常有多臺來自同一組服務(wù)器的GS,這些GS共同負責處理游戲邏輯,每臺游戲服務(wù)器負責一部分地圖處理。明確的分工不僅降低了單臺服務(wù)器的負載,同時也降低了GS宕機帶來的風險。每次玩家退出游戲是,服務(wù)器端就會將玩家當時所玩游戲的地圖編號和所在GS編號存放到玩家角色信息里,這樣等玩家再次登錄時,就會進入到上次退出時的GS。繼續(xù)進行上次的游戲。玩家也可以選擇從新開始游戲。
(5)DBServer
DBServer服務(wù)器主要的功能是進行玩家角色數(shù)據(jù)緩存和將緩存的玩家數(shù)據(jù)定時進行數(shù)據(jù)庫存取。緩存玩家數(shù)據(jù)是為了保證玩家需要的角色數(shù)據(jù)能快速的讀取和保存。由于角色數(shù)據(jù)量非常多,其中包括玩家的等級、生命值、經(jīng)驗、魔法值、技能、裝備、好友、公會等。如果每次GS獲取角色數(shù)據(jù)都去讀數(shù)據(jù)庫,那么讀取數(shù)據(jù)會非常慢,玩家最多的時候還會造成數(shù)據(jù)庫服務(wù)器崩潰,在DBServer中緩存角色數(shù)據(jù)后,提高了數(shù)據(jù)請求的響應(yīng)速度。定時將緩存的玩家數(shù)據(jù)存入數(shù)據(jù)庫,可以保證玩家數(shù)據(jù)永久存儲,并且即使宕機,玩家回檔,玩家的數(shù)據(jù)也是最近幾分鐘甚至幾秒鐘的數(shù)據(jù)。玩家登陸成功后,WorldServer會生成一個SessionKey并發(fā)給DBServer和客戶端,當玩家請求獲取角色信息和進入游戲世界時,DBServer會進行驗證,如果客戶端的SessionKey和自己保存的SessionKey不一致,則DBServer會認為玩家是不合法用戶,獲取角色信息會失敗。另外,玩家選取角色正式進入游戲時,GS需要到DBServer請求玩家的角色詳細數(shù)據(jù),這時DBServer同樣會驗證SessionKey的合法性。
(三)服務(wù)器交互的主要流程
下圖給出服務(wù)器與服務(wù)器間數(shù)據(jù)通訊的主要流程。
圖2 登陸流程
圖2的流程說明了,在選角色過程中,客戶端會把游戲賬號、經(jīng)過MD5的密碼發(fā)送給LS,LS去AccountDB讀取賬號信息進行驗證,驗證通過后,將驗證過信息發(fā)送給WS,WS生成一個SessionKey,分別發(fā)送給客戶端、DBServer和各個GameServer。之后WS連接到DBServer,從DBServer取得玩家的角色關(guān)鍵信息,如等級、職業(yè)、裝備等。DBServer比對從WS和客戶端獲得的SessionKey,如果發(fā)現(xiàn)是同一個SessionKey,則將玩家的所有角色信息發(fā)送給客戶端。之后客戶端就可以選擇一個角色進入游戲了。
圖3的流程說明了,在玩家選角色正式進入游戲時,GS會從客戶端取得此次的SessionKey,和自己從WS獲取的SessionKey做比較,以驗證SessionKey的合法性,驗證通過之后,客戶端和GS建立連接,同時GS通過WS轉(zhuǎn)發(fā),到DBServer獲取角色的全部信息,這些信息包括裝備、技能、好友、幫會、家族等等。
圖4的流程說明了,在玩家游戲過程,客戶端的所有操作,如走跑、說話、使用技能、做任務(wù)等都會通過WS轉(zhuǎn)發(fā)到WGS或者GS,所有的游戲邏輯處理都有WGS和GS處理,完成后再通過WS轉(zhuǎn)發(fā)給客戶端顯示。
三、總結(jié)
本論文從自身實際應(yīng)用出發(fā),提出了一種高性能服務(wù)器的架構(gòu)設(shè)計和解決方案,同時詳細探討了各種服務(wù)器的功能,以及服務(wù)器建的數(shù)據(jù)通信,清晰的圖解說明了各個服務(wù)器協(xié)同工作的過程。
參考文獻:
[1]蔣臻甄.MMORPG服務(wù)器集群的設(shè)計和實現(xiàn)[D].碩士論文:華東師范大學,2006
[2]GameDev.net網(wǎng)站及論壇.http://www.gamedev.net/page/index.html
[3]Smed,Jouni et al.Aspects of Networking in Multiplayer Computer Games.In Proceedings of the International Conference on Application and Development of Computer Games in the 21st Century,November,2001
[4]Baughman,Nathaniel and Levine,Brian.Cheat-Proof Playout for Centralized and Distributed Online Games.In Proceedings of the Twentieth IEEE Computer and Communication Society INFOCOM Conference.IEEE,April,2000