《游戲服務(wù)器架構(gòu)的演進(jìn)簡(jiǎn)史》要點(diǎn):
本文介紹了游戲服務(wù)器架構(gòu)的演進(jìn)簡(jiǎn)史,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
游戲服務(wù)器端,是一個(gè)會(huì)長(zhǎng)期運(yùn)行的程序,并且它還要服務(wù)于多個(gè)不定時(shí),不定點(diǎn)的網(wǎng)絡(luò)請(qǐng)求.
所以這類軟件的特點(diǎn)是要非常關(guān)注穩(wěn)定性和性能.這類程序如果需要多個(gè)協(xié)作來提高承載能力,則還要關(guān)注部署和擴(kuò)容的便利性;同時(shí),還需要考慮如何實(shí)現(xiàn)某種程度容災(zāi)需求.由于多進(jìn)程協(xié)同工作,也帶來了開發(fā)的復(fù)雜度,這也是需要關(guān)注的問題.
功能約束,是架構(gòu)設(shè)計(jì)決定性因素.基于游戲領(lǐng)域的功能特征,對(duì)服務(wù)器端系統(tǒng)來說,有以下幾個(gè)特殊的需求:
針對(duì)以上的需求特征,在服務(wù)器端,我們往往會(huì)關(guān)注對(duì)電腦內(nèi)存和 CPU 的使用,以求在特定業(yè)務(wù)代碼下,能盡量滿足承載量和響應(yīng)延遲的需求.最基本的做法就是“空間換時(shí)間”,用各種緩存的方式來以求得 CPU 和內(nèi)存空間上的平衡.
在 CPU 和內(nèi)存之上,是另外一個(gè)約束因素:網(wǎng)卡.網(wǎng)絡(luò)帶寬直接限制了服務(wù)器的處理能力,所以游戲服務(wù)器架構(gòu)也必定要考慮這個(gè)因素.
對(duì)于游戲服務(wù)端架構(gòu),最重要的三個(gè)部分就是,如何使用 CPU、內(nèi)存、網(wǎng)卡的設(shè)計(jì):
服務(wù)器基于游戲類型不同,所采用的架構(gòu)也有所不同,我們先講一下簡(jiǎn)單的模型,采用 http 通信模式架構(gòu)的服務(wù)器:
這種服務(wù)器架構(gòu)和我們常用的 web 服務(wù)器架構(gòu)差不多,也是采用 nginx 負(fù)載集群支持服務(wù)器的水平擴(kuò)展,memcache 做緩存.唯一不同的地點(diǎn)不同的在于通信層需要對(duì)協(xié)議再加工和加密,一般每個(gè)公司都有自己的一套基于 http 的協(xié)議層框架,很少采用開源框架.
長(zhǎng)連接游戲和弱聯(lián)網(wǎng)游戲不同的地方在于,長(zhǎng)連接中,玩家是有狀態(tài)的,服務(wù)器可以時(shí)時(shí)和 client 交互,數(shù)據(jù)的傳送,不像弱聯(lián)網(wǎng)一般每次都需要重新創(chuàng)建一個(gè)連接,消息傳送的頻率以及速度上都快于弱聯(lián)網(wǎng)游戲.
最早的游戲服務(wù)器是 1978 年,英國(guó)著名的財(cái)經(jīng)學(xué)校 University of Essex 的學(xué)生 Roy Trubshaw 編寫了世界上第一個(gè) MUD 程序,叫做《MUD1》.《MUD1》程序的源代碼在 ARPANET 共享之后,在全世界廣泛流行起來.不斷完善的 MUD1 的基礎(chǔ)上產(chǎn)生了開源的 MudOS(1991),成為眾多網(wǎng)游的鼻祖.
MUD1 是一款純文字的世界,沒有任何圖片,但是不同計(jì)算機(jī)前的玩家可以在游戲里共同冒險(xiǎn)、交流.與以往具有網(wǎng)絡(luò)聯(lián)機(jī)功能的游戲相比, MUD1 是第一款真正意義上的實(shí)時(shí)多人交互的網(wǎng)絡(luò)游戲,它最大的特色是能夠保證整個(gè)虛擬世界和玩家角色的持續(xù)發(fā)展——無論是玩家退出后重新登錄還是服務(wù)器重啟,游戲中的場(chǎng)景、寶箱、怪物和謎題仍保持不變,玩家的角色也依然是上次的狀態(tài).
MUD 中文版
MUDOS 使用單線程無阻塞套接字來服務(wù)所有玩家,所有玩家的請(qǐng)求都發(fā)到同一個(gè)線程去處理,主線程每隔 1 秒鐘更新一次所有對(duì)象(網(wǎng)絡(luò)收發(fā),對(duì)象狀態(tài),刷新地圖,刷新 NPC).用戶使用 Telnet 之類的客戶端用 Tcp 協(xié)議連接到 MUDOS 上,使用純文字進(jìn)行游戲,每條指令用回車進(jìn)行分割.這樣的系統(tǒng)在當(dāng)時(shí)每臺(tái)服務(wù)器承載個(gè) 4000 人同時(shí)游戲.從 1991 年的 MUDOS 發(fā)布后,全球各地都在為他改進(jìn),擴(kuò)充,推出新版本.
MUDOS 中游戲內(nèi)容通過 LPC 腳本進(jìn)行定制,邏輯處理采用單線程 tick 輪詢,這也是第一款服務(wù)端架構(gòu)模型,后來被應(yīng)用到不同游戲上.后續(xù)很多游戲都是跟《UO》一樣,直接在 MUDOS 上進(jìn)行二次開發(fā),直到 如今,一些回合制游戲,以及對(duì)運(yùn)算量小的游戲,依然采用這種服務(wù)器架構(gòu).
第一代服務(wù)器架構(gòu)圖
線程模型
2000 年左右,隨著圖形界面的出現(xiàn),游戲更多的采用圖形界面與用戶交互.此時(shí)隨著在線人數(shù)的增加和游戲數(shù)據(jù)的增加,服務(wù)器變得不抗重負(fù).于是就有了分服模型.分服模型結(jié)構(gòu)如下:
分服模型是游戲服務(wù)器中最典型,也是歷久最悠久的模型.在早期服務(wù)器的承載量達(dá)到上限的時(shí)候,游戲開發(fā)者就通過架設(shè)更多的服務(wù)器來解決.這樣提供了很多個(gè)游戲的“平行世界”,讓游戲中的人人之間的比較,產(chǎn)生了更多的空間.其特征是游戲服務(wù)器是一個(gè)個(gè)單獨(dú)的世界.每個(gè)服務(wù)器的帳號(hào)是獨(dú)立的,每臺(tái)服務(wù)器用戶的狀態(tài)都是不一樣的,一個(gè)服就是一個(gè)世界,大家各部牽扯.
后來游戲玩家呼吁要跨服打架,于是出現(xiàn)了跨服戰(zhàn),再加上隨著游戲的運(yùn)行,單個(gè)服務(wù)器的游戲活躍玩家越來越少,所以后期就有了服務(wù)器的合并以及遷移,慢慢的以服務(wù)器的開放、合并形成了一套成熟的運(yùn)營(yíng)手段.目前多數(shù)游戲還采用分服的結(jié)構(gòu)來架設(shè)服務(wù)器,多數(shù)頁游還是采用這種模式.
線程調(diào)度
分服雖然可以解決服務(wù)器擴(kuò)展的瓶頸,但單臺(tái)服務(wù)器在以前單線程的方式來運(yùn)行,沒辦法充分利用服務(wù)器資源,于是又演變出了以下兩種線程模型.
異步 – 多線程:基于每個(gè)場(chǎng)景(或者房間),分配一個(gè)線程.每個(gè)場(chǎng)景的玩家同屬于一個(gè)線程.游戲的場(chǎng)景是固定的,不會(huì)很多,如此線程的數(shù)量可以保證不會(huì)不斷增大.每個(gè)場(chǎng)景線程,同樣采用 tick 輪詢的方式,來定時(shí)更新該場(chǎng)景內(nèi)的(對(duì)象狀態(tài),刷新地圖,刷新 NPC)數(shù)據(jù)狀態(tài).玩家如果跨場(chǎng)景的話,就采用投遞和通知的方式,告知兩個(gè)場(chǎng)景線程,以此更新兩個(gè)場(chǎng)景的玩家數(shù)據(jù).
多進(jìn)程:由于單進(jìn)程架構(gòu)下,總會(huì)存在承載量的極限,越是復(fù)雜的游戲,其單進(jìn)程承載量就越低,因此一定要突破進(jìn)程的限制,才能支撐更復(fù)雜的游戲.多進(jìn)程系統(tǒng)的其他一些好處:能夠利用上多核 CPU 能力、更容易進(jìn)行容災(zāi)處理.
多進(jìn)程系統(tǒng)比較經(jīng)典的模型是“三層架構(gòu)”,比如,基于之前的場(chǎng)景線程再做改進(jìn),把網(wǎng)絡(luò)部分和數(shù)據(jù)庫部分分離為單獨(dú)的進(jìn)程來處理,邏輯進(jìn)程專心處理邏輯任務(wù),不合 IO 打交道,網(wǎng)絡(luò) IO 和磁盤 IO 分別交由網(wǎng)路進(jìn)程和 DB 進(jìn)程處理.
之前的網(wǎng)游服務(wù)器都是分區(qū)分服,玩家都被劃分在不同的服務(wù)器上,每臺(tái)服務(wù)器運(yùn)行的邏輯相同,玩家不能在不同服務(wù)器之間交互.想要更多的玩家在同一世界,保持玩家的活躍度,于是就有了世界服模型了.世界服類型也有以下 3 種演化:
一類型(三層架構(gòu))
網(wǎng)關(guān)部分分離成單端的 gate 服務(wù)器,DB 部分分離為 DB 服務(wù)器,把網(wǎng)絡(luò)功能單獨(dú)提取出來,讓用戶統(tǒng)一去連接一個(gè)網(wǎng)關(guān)服務(wù)器,再有網(wǎng)關(guān)服務(wù)器轉(zhuǎn)發(fā)數(shù)據(jù)到后端游戲服務(wù)器.而游戲服務(wù)器之間數(shù)據(jù)交換也統(tǒng)一連接到網(wǎng)管進(jìn)行交換.所有有 DB 交互的,都連接到 DB 服務(wù)器來代理處理.
二類型(cluster)
有了一類型的經(jīng)驗(yàn),后續(xù)肯定是拆分的越細(xì),性能越好,就類似現(xiàn)在微服務(wù),每個(gè)相同的模塊分布到一臺(tái)服務(wù)器處理,多組服務(wù)器集群共同組成一個(gè)游戲服務(wù)端.一般地,我們可以將一個(gè)組內(nèi)的服務(wù)器簡(jiǎn)單地分成兩類:場(chǎng)景相關(guān)的(如:行走、戰(zhàn)斗等)以及場(chǎng)景不相關(guān)的(如:公會(huì)聊天、不受區(qū)域限制的貿(mào)易等).經(jīng)常可以見到的一種方案是:gate 服務(wù)器、場(chǎng)景服務(wù)器、非場(chǎng)景服務(wù)器、聊天管理器、AI 服務(wù)器以及數(shù)據(jù)庫代理服務(wù)器.如下模型:
以上中我們簡(jiǎn)單的講下服務(wù)器的三種類型功能:
通過這種類型服務(wù)器架構(gòu),因?yàn)閴毫Ψ稚⒘?性能會(huì)有明顯提升,負(fù)載也更大了,包括目前一些大型的 MMORPG 游戲就是采用此架構(gòu).不過每增加一級(jí)服務(wù)器,狀態(tài)機(jī)復(fù)雜度可能會(huì)翻倍,導(dǎo)致研發(fā)和找 bug 的成本上升,這個(gè)對(duì)開發(fā)組挑戰(zhàn)比較大,沒有經(jīng)驗(yàn),很容出錯(cuò).
三類型(無縫地圖)
魔獸世界的中無縫地圖,想必大家印象深刻, 整個(gè)世界的移動(dòng)沒有像以往的游戲一樣,在切換場(chǎng)景的時(shí)候需要 loading 等待,而是直接行走過去,體驗(yàn)流暢.
現(xiàn)在的游戲大地圖采用無縫地圖多數(shù)采用的是 9 宮格的樣式來處理,由于地圖沒有魔獸世紀(jì)那么大,所以采用單臺(tái)服務(wù)器多進(jìn)程處理即可,不過類似魔獸世界這種大世界地圖,必須考慮 2 個(gè)問題:
1、多個(gè)地圖節(jié)點(diǎn)如何無縫拼接,特別是當(dāng)?shù)貓D節(jié)點(diǎn)比較多的時(shí)候,如何保證無縫拼接
2、如何支持動(dòng)態(tài)分布,有些區(qū)域人多,有些區(qū)域人少,保證服務(wù)器資源利用的最大化
為了解決這個(gè)問題,比較以往按照地圖來切割游戲而言,無縫世界并不存在一塊地圖上面的人有且只由一臺(tái)服務(wù)器處理了,此時(shí)需要一組服務(wù)器來處理,每臺(tái) Node 服務(wù)器用來管理一塊地圖區(qū)域,由 NodeMaster(NM)來為他們提供總體管理.更高層次的 World 則提供大陸級(jí)別的管理服務(wù).
一個(gè) Node 所負(fù)責(zé)的區(qū)域,地理上沒必要連接在一起,可以統(tǒng)一交給一個(gè) Node 去管理,而這些區(qū)塊在地理上并沒有聯(lián)系在一起的必要性.一個(gè) Node 到底管理哪些區(qū)塊,可以根據(jù)游戲?qū)崟r(shí)運(yùn)行的負(fù)載情況,定時(shí)維護(hù)的時(shí)候進(jìn)行更改 NodeMaster 上面的配置.
對(duì)象的無縫遷移
玩家 A、B、C 分別代表 3 種不同的狀態(tài),以及不同的遷移方式,我們分別來看.
具體魔獸世界服務(wù)器的分析,篇幅過多,我們以后再聊.
房間類玩法和 MMORPG 有很大的不同,在于其在線廣播單元的不確定性和廣播數(shù)量很小.而且需要匹配一臺(tái)房間服務(wù)器讓少數(shù)人進(jìn)入一個(gè)服務(wù)器.
這一類游戲最重要的是其“游戲大廳”的承載量,每個(gè)“游戲房間”受邏輯所限,需要維持和廣播的玩家數(shù)據(jù)是有限的,但是“游戲大廳”需要維持相當(dāng)高的在線用戶數(shù),所以一般來說,這種游戲還是需要做“分服”的.典型的游戲就是《英雄聯(lián)盟》這一類游戲了.而“游戲大廳”里面最有挑戰(zhàn)性的任務(wù),就是“自動(dòng)匹配”玩家進(jìn)入一個(gè)“游戲房間”,這需要對(duì)所有在線玩家做搜索和過濾.
玩家先登錄“大廳服務(wù)器”,然后選擇組隊(duì)游戲的功能,服務(wù)器會(huì)通知參與的所有游戲客戶端,新開一條連接到房間服務(wù)器上,這樣所有參與的用戶就能在房間服務(wù)器里進(jìn)行游戲交互了.
以上就是目前游戲服務(wù)器的演化進(jìn)程,由于所涉及的內(nèi)容太多,關(guān)于服務(wù)器的相關(guān)網(wǎng)絡(luò) IO 以及內(nèi)存模型都沒有介紹,以后有機(jī)會(huì)再具體講講這一部分.
wier,樂元素leader軟件工程師.從2010年起從事游戲開發(fā),經(jīng)歷過頁游和手游兩個(gè)游戲發(fā)展期,期間曾帶領(lǐng)團(tuán)隊(duì)開發(fā)過山寨機(jī)上第一款偷菜游戲,如今專注于二次元游戲領(lǐng)域及服務(wù)器技術(shù)研究,運(yùn)維了一個(gè)游戲公眾號(hào),期待用自己的一點(diǎn)努力和貢獻(xiàn),推進(jìn)游戲社區(qū)的前進(jìn).個(gè)人微信號(hào)ID:wierWu(添加時(shí)請(qǐng)注明‘InfoQ’) ;微信公眾號(hào):大碼侯(cool_wier)
文章來自微信公眾號(hào):高效開發(fā)運(yùn)維
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/2216.html