?網(wǎng)絡(luò)游戲的結(jié)構(gòu)分為客戶端與服務(wù)器端,客戶端采用2D繪制引擎或者3D繪制引擎繪制游戲世界的實(shí)時(shí)畫面,服務(wù)器端則負(fù)責(zé)響應(yīng)所有客戶端的連接請求和游戲邏輯處理,并控制所有客戶端的游戲畫面繪制??蛻舳伺c服務(wù)器通過網(wǎng)絡(luò)數(shù)據(jù)包交互完成每一步游戲邏輯,由于游戲邏輯是由服務(wù)器負(fù)責(zé)處理的,要保證面對海量用戶登錄時(shí),游戲具有良好的流暢性和用戶體驗(yàn),優(yōu)秀的服務(wù)器架構(gòu)起到了關(guān)鍵的作用。
1 服務(wù)器架構(gòu)設(shè)計(jì)
1.1 服務(wù)器架構(gòu)分類
? ? ? ?服務(wù)器組的架構(gòu)一般分為兩種:第一種是帶網(wǎng)關(guān)服務(wù)器的服務(wù)器架構(gòu);第二種是不帶網(wǎng)關(guān)服務(wù)器的服務(wù)器架構(gòu),這兩種方案各有利弊。在給出服務(wù)器架構(gòu)設(shè)計(jì)之前,先對這兩種設(shè)計(jì)方案進(jìn)行詳細(xì)的探討。
所謂網(wǎng)關(guān)服務(wù)器,其實(shí)是Gate服務(wù)器,比如LoginGate、GameGate等。網(wǎng)關(guān)服務(wù)器的主要職責(zé)是將客戶端和游戲服務(wù)器隔離,客戶端程序直接與這些網(wǎng)關(guān)服務(wù)器通信,并不需要知道具體的游戲服務(wù)器內(nèi)部架構(gòu),包括它們的IP、端口、網(wǎng)絡(luò)通信模型(完成端口或Epoll)等??蛻舳酥慌c網(wǎng)關(guān)服務(wù)器相連,通過網(wǎng)關(guān)服務(wù)器轉(zhuǎn)發(fā)數(shù)據(jù)包間接地與游戲服務(wù)器交互。同樣地,游戲服務(wù)器也不直接和客戶端通信,發(fā)給客戶端的協(xié)議都通過網(wǎng)關(guān)服務(wù)器進(jìn)行轉(zhuǎn)發(fā)。
1.2 服務(wù)器架構(gòu)設(shè)計(jì)
根據(jù)網(wǎng)絡(luò)游戲的規(guī)模和設(shè)計(jì)的不同,每組服務(wù)器中服務(wù)器種類和數(shù)量是不盡相同的。本文設(shè)計(jì)出的帶網(wǎng)關(guān)服務(wù)器的服務(wù)器組架構(gòu)如圖1所示。
本文將服務(wù)器設(shè)計(jì)成帶網(wǎng)關(guān)服務(wù)器的架構(gòu),雖然加大了服務(wù)器的設(shè)計(jì)復(fù)雜度,但卻帶來了以下幾點(diǎn)好處:
(1)作為網(wǎng)絡(luò)通信的中轉(zhuǎn)站,負(fù)責(zé)維護(hù)將內(nèi)網(wǎng)和外網(wǎng)隔離開,使外部無法直接訪問內(nèi)部服務(wù)器,保障內(nèi)網(wǎng)服務(wù)器的安全,一定程度上較少外掛的攻擊。
(2)網(wǎng)關(guān)服務(wù)器負(fù)責(zé)解析數(shù)據(jù)包、加解密、超時(shí)處理和一定邏輯處理,這樣可以提前過濾掉錯(cuò)誤包和非法數(shù)據(jù)包。
(3)客戶端程序只需建立與網(wǎng)關(guān)服務(wù)器的連接即可進(jìn)入游戲,無需與其它游戲服務(wù)器同時(shí)建立多條連接,節(jié)省了客戶端和服務(wù)器程序的網(wǎng)絡(luò)資源開銷。
(4)在玩家跳服務(wù)器時(shí),不需要斷開與網(wǎng)關(guān)服務(wù)器的連接,玩家數(shù)據(jù)在不同游戲服務(wù)器間的切換是內(nèi)網(wǎng)切換,切換工作瞬間完成,玩家?guī)缀醪煊X不到,這保證了游戲的流暢性和良好的用戶體驗(yàn)。
? ? ? ?在享受網(wǎng)關(guān)服務(wù)器帶來上述好處的同時(shí),還需注意以下可能導(dǎo)致負(fù)面效果的兩個(gè)情況:如何避免網(wǎng)關(guān)服務(wù)器成為高負(fù)載情況下的通訊瓶頸問題以及由于網(wǎng)關(guān)的單節(jié)點(diǎn)故障導(dǎo)致整組服務(wù)器無法對外提供服務(wù)的問題。上述兩個(gè)問題可以采用“多網(wǎng)關(guān)” 技術(shù)加以解決。顧名思義,“多網(wǎng)關(guān)” 就是同時(shí)存在多個(gè)網(wǎng)關(guān)服務(wù)器,比如一組服務(wù)器可以配置三臺(tái)GameGate。當(dāng)負(fù)載較大時(shí),可以通過增加網(wǎng)關(guān)服務(wù)器來增加網(wǎng)關(guān)的總體通訊流量,當(dāng)一臺(tái)網(wǎng)關(guān)服務(wù)器宕機(jī)時(shí),它只會(huì)影響連接到本服務(wù)器的客戶端,其它客戶端不會(huì)受到任何影響。
? ? ? ?從圖1的服務(wù)器架構(gòu)圖可以看出,一組服務(wù)器包括LoginGate、LoginServer、GameGate、GameServer、DBServer和MServer等多種服務(wù)器。LoginGate和GameGate就是網(wǎng)關(guān)服務(wù)器,一般一組服務(wù)器會(huì)配置3臺(tái)GameGate,因?yàn)榉€(wěn)定性對于網(wǎng)絡(luò)游戲運(yùn)營來說是至關(guān)重要的,而服務(wù)器宕機(jī)等突發(fā)事件是游戲運(yùn)營中所面臨的潛在風(fēng)險(xiǎn),配置多臺(tái)服務(wù)器可以有效地降低單個(gè)服務(wù)器宕機(jī)帶來的風(fēng)險(xiǎn)。另外,配置多臺(tái)網(wǎng)關(guān)服務(wù)器也是進(jìn)行負(fù)載均衡的有效手段之一。下面將對各種服務(wù)器的主要功能和彼此之間的數(shù)據(jù)交互做詳細(xì)解釋。
(1)LoginGate
? ? ? ?LoginGate主要負(fù)責(zé)在玩家登錄時(shí)維護(hù)客戶端與LoginServer之間的網(wǎng)絡(luò)連接與通訊,對LoginServer和客戶端的通信數(shù)據(jù)進(jìn)行加解密、校驗(yàn)。
(2)LoginServer
? ? ? ?LoginServer主要功能是驗(yàn)證玩家的賬號(hào)是否合法,只有通過驗(yàn)證的賬號(hào)才能登錄游戲。從架構(gòu)圖可以看出, DBServer和GameServer會(huì)連接LoginServer。玩家登錄基本流程是,客戶端發(fā)送賬號(hào)和密碼到LoginServer驗(yàn)證,如果驗(yàn)證通過,LoginServer會(huì)給玩家分配一個(gè)SessionKey,LoginServer會(huì)把這個(gè)SessionKey發(fā)送給客戶端、DBServer和GameServer,在后續(xù)的選擇角色以后進(jìn)入游戲過程中,DBServer和GameServer將驗(yàn)證SessionKey合法性,如果和客戶端攜帶的SessionKey不一致,將無法成功獲取到角色或者進(jìn)入游戲。
(3)GameGate
? ? ? ?GameGate(GG)主要負(fù)責(zé)在用戶游戲過程中負(fù)責(zé)維持GS與客戶端之間的網(wǎng)絡(luò)連接和通訊,對GS和客戶端的通信數(shù)據(jù)進(jìn)行加解密和校驗(yàn),對客戶端發(fā)往GS的用戶數(shù)據(jù)進(jìn)行解析,過濾錯(cuò)誤包,對客戶端發(fā)來的一些協(xié)議作簡單的邏輯處理,其中包括游戲邏輯中的一些超時(shí)判斷。在用戶選擇角色過程中負(fù)責(zé)維持DBServer與客戶端之間的網(wǎng)絡(luò)連接和通訊,對DBServer和客戶端的通信數(shù)據(jù)進(jìn)行加解密和校驗(yàn),對客戶端發(fā)往DBServer的用戶數(shù)據(jù)做簡單的分析。維持客戶端與MServer之間的網(wǎng)絡(luò)連接與通訊、加解密、數(shù)據(jù)轉(zhuǎn)發(fā)和簡單的邏輯處理等。
(4)GameServer
? ? ? ?GameServer(GS)主要負(fù)責(zé)游戲邏輯處理。網(wǎng)絡(luò)游戲有龐大世界觀背景,絢麗激烈的陣營對抗以及完備的裝備和技能體系。目前,網(wǎng)絡(luò)游戲主要包括任務(wù)系統(tǒng)、聲望系統(tǒng)、玩家PK、寵物系統(tǒng)、擺攤系統(tǒng)、行會(huì)系統(tǒng)、排名系統(tǒng)、副本系統(tǒng)、生產(chǎn)系統(tǒng)和寶石系統(tǒng)等。從軟件架構(gòu)角度來看,這些系統(tǒng)可以看著GS的子系統(tǒng)或模塊,它們共同處理整個(gè)游戲世界邏輯的運(yùn)算。游戲邏輯包括角色進(jìn)入與退出游戲、跳GS以及各種邏輯動(dòng)作(比如行走、跑動(dòng)、說話和攻擊等)。
? ? ? ?由于整個(gè)游戲世界有許多游戲場景,在該架構(gòu)中一組服務(wù)器有3臺(tái)GS共同負(fù)責(zé)游戲邏輯處理,每臺(tái)游戲服務(wù)器負(fù)責(zé)一部分地圖的處理,這樣不僅降低了單臺(tái)服務(wù)器的負(fù)載,而且降低了GS宕機(jī)帶來的風(fēng)險(xiǎn)。玩家角色信息里會(huì)保持玩家上次退出游戲時(shí)的地圖編號(hào)和所在GS編號(hào),這樣玩家再次登錄時(shí),會(huì)進(jìn)入到上次退出時(shí)的GS。
? ? ? ?上面提到過,在驗(yàn)證賬號(hào)之后,LoginServer會(huì)把這個(gè)SessionKey 發(fā)給GS,當(dāng)玩家選擇角色登錄GS時(shí),會(huì)把SessionKey一起發(fā)給GS,這時(shí)GS會(huì)驗(yàn)證SessionKey是否與其保存的相一致,不一致的話GS會(huì)拒絕玩家進(jìn)入游戲。MServer的主要負(fù)責(zé)GS之間的數(shù)據(jù)轉(zhuǎn)發(fā)以及數(shù)據(jù)廣播,另外,一些系統(tǒng)也可以放到MServer上,這樣也可以減輕GS的運(yùn)算壓力。
(5)DBServer
? ? ? ?DBServer主要的功能是緩存玩家角色數(shù)據(jù),保證角色數(shù)據(jù)能快速的讀取和保存。由于角色數(shù)據(jù)量是比較大的,包括玩家的等級(jí)、經(jīng)驗(yàn)、生命值、魔法值、裝備、技能、好友、公會(huì)等。如果每次GS獲取角色數(shù)據(jù)都去讀數(shù)據(jù)庫,效率必然非常低下,用DBServer緩存角色數(shù)據(jù)之后,極大地提高了數(shù)據(jù)請求的響應(yīng)速度。
? ? ? ?LoginServer會(huì)在玩家選組時(shí)把SessionKey發(fā)給DBServer,當(dāng)玩家發(fā)送獲取角色信息協(xié)議時(shí)會(huì)帶上這個(gè)SessionKey,如果跟DBServer保存的SessionKey不一致,則DBServer會(huì)認(rèn)為玩家不是合法用戶,獲取角色協(xié)議將會(huì)失敗。另外,玩家選取角色正式進(jìn)入游戲時(shí),GS會(huì)給DBServer發(fā)送攜帶SessionKey的獲取角色信息協(xié)議,這時(shí)DBServer同樣會(huì)驗(yàn)證SessionKey的合法性。總之,只有客戶端、DBServer和GS所保存的SessionKey一致,才能保證協(xié)議收到成功反饋。
? ? ? ?與DBServer通訊的服務(wù)器主要有GG,GS和LoginServer,DBServer與GG交互的協(xié)議主要包括列角色、創(chuàng)建角色、刪除角色、恢復(fù)角色等,DBServer與GS交互的協(xié)議包括讀取角色數(shù)據(jù)、保存角色數(shù)據(jù)和跳服務(wù)器等,DBServer與LoginServer交互的協(xié)議主要是用戶登錄協(xié)議,這時(shí)候會(huì)給DBServer發(fā)送SessionKey。
(6)MServer
? ? ? ?每一個(gè)組有一臺(tái)MServer,主要負(fù)責(zé)維持3臺(tái)GS之間數(shù)據(jù)的轉(zhuǎn)發(fā)和數(shù)據(jù)廣播。另外一些游戲系統(tǒng)也可能會(huì)放到MServer上處理,比如行會(huì)系統(tǒng)。
1.3 服務(wù)器交互的主要流程
? ? ? ?下面給出服務(wù)器之間數(shù)據(jù)通訊的主要流程從這些流程能看出各種服務(wù)器之間是如何數(shù)據(jù)交互和協(xié)同工作的。
? ? ? ?圖2的流程說明了,在選角色過程中,客戶端會(huì)把攜帶游戲賬號(hào)和SessionKey的選角色協(xié)議發(fā)給GG,GG做一些簡單處理之后轉(zhuǎn)發(fā)給DBServer,DBServer要驗(yàn)證SessionKey的合法性,驗(yàn)證通過之后,DBServer會(huì)從角色信息緩沖區(qū)里取出該賬戶的所有角色信息發(fā)給客戶端。這個(gè)過程在客戶端的表現(xiàn)是,當(dāng)選擇好服務(wù)器組之后,客戶端會(huì)直接顯示該賬號(hào)下的所有角色,之后就可以選擇角色進(jìn)入游戲了。
? ? ? ?圖3的流程說明了,在玩家選角色正式進(jìn)入游戲時(shí),客戶端會(huì)把攜帶游戲賬號(hào)、角色I(xiàn)D和SessionKey的登錄協(xié)議發(fā)給GG,GG做一些簡單處理之后轉(zhuǎn)發(fā)給GS。GS會(huì)驗(yàn)證SessionKey的合法性,驗(yàn)證通過之后,GS會(huì)把驗(yàn)證通過的結(jié)果發(fā)給客戶端,同時(shí)GS給DBServer發(fā)獲取角色數(shù)據(jù)的協(xié)議,這些角色數(shù)據(jù)是一個(gè)玩家所有的游戲數(shù)據(jù),包括裝備、技能等等。
? ? ? ?圖4的流程說明了,在玩家游戲過程,客戶端把邏輯協(xié)議(包括走、說話、跑、使用技能等)發(fā)給GG,GG完成加解密和簡單邏輯處理之后轉(zhuǎn)發(fā)給GS,GS負(fù)責(zé)這些協(xié)議的主要
邏輯處理。
2 總結(jié)
? ? ? ?網(wǎng)絡(luò)游戲服務(wù)器的架構(gòu)設(shè)計(jì)已經(jīng)成為當(dāng)前網(wǎng)絡(luò)游戲研究領(lǐng)域的熱點(diǎn),因?yàn)?b>高性能服務(wù)器架構(gòu)設(shè)計(jì)是一款網(wǎng)絡(luò)游戲成功的關(guān)鍵。本文從實(shí)際應(yīng)用出發(fā),提出了一種高性能的服務(wù)器架構(gòu)設(shè)計(jì)解決方案,并且詳細(xì)探討了各種服務(wù)器的功能,本文的最后給出了幾個(gè)服務(wù)器之間數(shù)據(jù)通訊的關(guān)鍵流程,以圖文并茂的方式解釋各個(gè)服務(wù)器是如何協(xié)同工作的。