高性能的網(wǎng)絡(luò)游戲服務(wù)器的設(shè)計(jì)[轉(zhuǎn)]
2007年10月05日 星期五 18:08
說(shuō)起高性能的網(wǎng)絡(luò)游戲,有2個(gè)典范,1個(gè)是暴雪的WOW,另外一個(gè)要數(shù)騰訊的QQGame了,因?yàn)閷?duì)于MMPRPG的體系接觸不深,幾乎屬于文盲,沒(méi)有太多的發(fā)言權(quán),而自己又是搞休閑游戲開(kāi)發(fā)的所以本文就主要談?wù)凲QGame了。
前些天通過(guò)朋友得到了QQGame的一個(gè)系統(tǒng)分析的文檔,看完后很是震驚,徹底被QQ的設(shè)計(jì)所折服了,到底是千萬(wàn)人在線系統(tǒng)經(jīng)驗(yàn)的擁有者,牛!
通過(guò)資料了解到QQGame目前有以下讓我欣賞的特性:
1.單機(jī)最高容納35,000人同時(shí)在線,對(duì)沒(méi)有看錯(cuò)是這么多,由于它適用了Linux下高性能的網(wǎng)絡(luò)處理模型ePoll技術(shù),并且一系列高超的優(yōu)化技術(shù)輕松破萬(wàn)人,當(dāng)然為了穩(wěn)定性考慮單機(jī)保持了2萬(wàn)人的容量,此時(shí)的帶寬消耗為近30M;
2.采用共享內(nèi)存方式高速完成進(jìn)程間高速通訊;
3.服務(wù)器的擴(kuò)充方式不是平面的方式,而是裂變式的擴(kuò)充方式,形成負(fù)載均衡陣列樹(shù)狀結(jié)構(gòu);
4.所有的游戲服務(wù)器不是直接和數(shù)據(jù)庫(kù)聯(lián)系,而是和數(shù)據(jù)proxy(qq管叫數(shù)據(jù)交換機(jī)和路由器)進(jìn)行聯(lián)系,由此帶來(lái)的就是游戲用戶(hù)數(shù)據(jù)的分布存儲(chǔ),我分析著應(yīng)該是proxy上記錄著這個(gè)用戶(hù)數(shù)據(jù)所在的實(shí)際的dbserver的信息,然后定時(shí)的將最新的用戶(hù)信息寫(xiě)回到db中去,這樣就大大緩解了數(shù)據(jù)庫(kù)服務(wù)器的壓力,而且可以非常平滑的將數(shù)據(jù)分裂開(kāi)來(lái),數(shù)據(jù)庫(kù)服務(wù)器也就可以無(wú)限的擴(kuò)充,當(dāng)然我覺(jué)得肯定有個(gè)數(shù)據(jù)庫(kù)信息索引了用戶(hù)的id和對(duì)應(yīng)的存儲(chǔ)地點(diǎn)的關(guān)聯(lián)關(guān)系,這點(diǎn)就類(lèi)似于google的原理了,所以對(duì)于數(shù)據(jù)庫(kù)的硬件要求也就不是那么高了,qqgame的一組服務(wù)器通常是7臺(tái)服務(wù)器,可以容納5萬(wàn)人,其中就包含了數(shù)據(jù)庫(kù)服務(wù)器,這點(diǎn)就不是棋牌游戲所常使用的數(shù)據(jù)集中存儲(chǔ)了;
5.游戲服務(wù)器的網(wǎng)絡(luò)和邏輯分開(kāi),不僅僅是層次上的分開(kāi),而是在進(jìn)程上分開(kāi),然后中間通過(guò)共享通道進(jìn)行管理和協(xié)調(diào),并且增加了輔助線程,在主線程處理大壓力的異步的操作的時(shí)候直接交給輔助線程處理,保障了游戲服務(wù)器的高效性運(yùn)轉(zhuǎn)。
作為游戲服務(wù)器的結(jié)構(gòu)方面(以下只討論休閑游戲部分,MMORPG服務(wù)器不屬于討論范圍)的設(shè)計(jì)已經(jīng)相對(duì)于成熟并且統(tǒng)一,結(jié)構(gòu)方面和3年前我所接觸的中游系的那套平臺(tái)沒(méi)有太大的差異,無(wú)非是服務(wù)器群采用星狀的結(jié)構(gòu),以1個(gè)中心節(jié)點(diǎn)作為核心,然后向四周擴(kuò)散出一些應(yīng)用服務(wù)器,如負(fù)責(zé)登陸的LoginServer,負(fù)責(zé)具體游戲邏輯的GameServer等等,當(dāng)然最精簡(jiǎn)的結(jié)構(gòu)是這樣的,這樣的結(jié)構(gòu)可以滿足50萬(wàn)以下同時(shí)在線的容量,如果為了滿足更大的容量,如QQGAME這樣的目前已經(jīng)有200萬(wàn)以上同時(shí)在線的超大容量的應(yīng)用則需要額外的優(yōu)化,從這個(gè)結(jié)構(gòu)中分離出一些子應(yīng)用獨(dú)立開(kāi)發(fā)出一些服務(wù)器端來(lái)處理,一方面降低偶合度,另外一方面作為高可用性系統(tǒng)為負(fù)載均衡提供條件.
關(guān)于負(fù)載均衡,作為整個(gè)游戲平臺(tái)的所有服務(wù)器.我覺(jué)得除了具體的游戲邏輯服務(wù)器以外都是可以采用負(fù)載均衡,多點(diǎn)分擔(dān)的方式來(lái)處理,惟獨(dú)邏輯服務(wù)器不可以,因?yàn)樾蓍e游戲,都是分層次的,不管泡泡堂也好,QQGAME也好這些游戲其實(shí)在客戶(hù)端的表現(xiàn)形式都是分層次的,如QQGAME就是LOBBY-HALL-ROOM這樣的結(jié)構(gòu),LOBBY這層就是游戲廣場(chǎng)了,可以看到所有的游戲類(lèi)別,游戲服務(wù)器和具體的游戲大廳,比如:牌類(lèi)–斗地主–新手場(chǎng)–新手場(chǎng)1 這樣的順序,傳統(tǒng)的設(shè)計(jì)中新手場(chǎng)1就是屬于一個(gè)獨(dú)立的游戲邏輯服務(wù)器擁有一個(gè)獨(dú)立的IP以及偵聽(tīng)端口,在服務(wù)器端通常也是一個(gè)獨(dú)立的進(jìn)程.一般的游戲服務(wù)器允許的連接數(shù)通常都是300-600人之間超過(guò)的就提示服務(wù)器已滿了,這樣做的原因并不是因?yàn)檫M(jìn)程的限制因?yàn)橐粋€(gè)進(jìn)程完全可以做到同時(shí)讓3000以上的玩家同時(shí)游戲,而是人為設(shè)計(jì)的考慮,因?yàn)樵谟螒蜻壿嫹?wù)器中有很多需要廣播的消息,如游戲玩家的聊天信息,某個(gè)房間的開(kāi)始信息,結(jié)束信息,某人進(jìn)出的信息等,而對(duì)于廣播來(lái)說(shuō),給300個(gè)人廣播和給3000個(gè)人廣播所消耗的資源是絕對(duì)沒(méi)有可比性的。但是通過(guò)從進(jìn)程上獨(dú)立來(lái)處理這個(gè)傳統(tǒng)的方式也有個(gè)缺陷,比如通過(guò)開(kāi)10個(gè)進(jìn)程來(lái)達(dá)到3000人和1個(gè)進(jìn)程達(dá)到3000人,如果不考慮廣播的因素在內(nèi)的話前者的資源是要高與后者的資源的,并且進(jìn)程間的通訊也要比進(jìn)程內(nèi)的通訊要耗費(fèi)資源和復(fù)雜度方面要高很多,比如說(shuō)如果要實(shí)現(xiàn)一個(gè)需求讓玩家可以在同一類(lèi)游戲中可以使用小喇叭類(lèi)或者跨游戲服務(wù)器找人之類(lèi)的功能的話,同一個(gè)進(jìn)程的優(yōu)勢(shì)就顯示出來(lái)了,為此QQGAME所使用的是Channel(頻道)的概念,即一個(gè)游戲邏輯服務(wù)器的進(jìn)程可以容納5000人左右,然后服務(wù)器端通過(guò)設(shè)置分割出很多的Channel如新手1,新手2,新手3之類(lèi)的傳統(tǒng)意義上的游戲大廳,將消息的分發(fā)范圍進(jìn)行隔離,節(jié)約了資源。這一點(diǎn)可以通過(guò)查看連接屬性看到,連接QQGAME的同類(lèi)型靠近的幾個(gè)游戲大廳其實(shí)端口和IP都是一致的。
我們目前的游戲服務(wù)器類(lèi)型主要有3類(lèi):CenterServer,管理著所有的服務(wù)器連接,LoginServer 負(fù)責(zé)處理用戶(hù)的登陸、注冊(cè),并且用來(lái)給用戶(hù)傳遞游戲邏輯服務(wù)器列表等功能, GameServer具體邏輯服務(wù)器,根據(jù)不同的邏輯來(lái)實(shí)現(xiàn)不同的游戲需求。
當(dāng)然,根據(jù)業(yè)務(wù)的發(fā)展需要,我們正準(zhǔn)備把用戶(hù)的狀態(tài)在服務(wù)器端保存,并且增加一個(gè)類(lèi)似IM服務(wù)器的功能來(lái)滿足玩家跨服務(wù)器聊天和查詢(xún)其他玩家狀態(tài)的需要。以及GM服務(wù)器實(shí)現(xiàn)多功能的網(wǎng)管室的需求,這些將在以后慢慢寫(xiě)。
今天開(kāi)始寫(xiě)些技術(shù)的題材,一方面記錄一些自己的本分工作的東西,另外一方面也是充實(shí)一下BLOG,工作太忙也沒(méi)有什么太多的思緒來(lái)一直寫(xiě)其他的題材,所以就拿工作來(lái)填充了.同時(shí)如果有人有幸看到了這些文章,并且也有興趣的話也希望多多探討.
先簡(jiǎn)單介紹一下,由于本人的工作就是游戲開(kāi)發(fā)公司的,一直與游戲開(kāi)發(fā)打交道,主要做休閑類(lèi)的游戲,目前又以棋牌游戲?yàn)橹?在這個(gè)行業(yè)中摸爬滾打了整3年了,從運(yùn)營(yíng)開(kāi)始做起,運(yùn)營(yíng)過(guò)當(dāng)時(shí)國(guó)內(nèi)一流的游戲平臺(tái)中游系列的產(chǎn)品,然后由于合作方面的原因又自主開(kāi)發(fā)過(guò)一套游戲平臺(tái),然后由于發(fā)展方向上的分歧出來(lái)單獨(dú)做,目前在開(kāi)發(fā)并運(yùn)維一套全新的產(chǎn)品.
這篇主要是對(duì)于游戲服務(wù)器的一些想法,結(jié)合目前自身的產(chǎn)品的一些問(wèn)題延伸開(kāi)來(lái)的.
目前我們的服務(wù)器還是屬于Windows平臺(tái)的架構(gòu),暫時(shí)還沒(méi)有考慮到跨平臺(tái),主要原因有2:
1.成本:作為公司來(lái)說(shuō)首先得考慮的就是成本了,雖然說(shuō)Linux類(lèi)的平臺(tái)存在著操作系統(tǒng)成本低廉,性能優(yōu)異,穩(wěn)定性高這幾個(gè)特色,但是作為全局考慮來(lái)說(shuō),一個(gè)Linux的系統(tǒng)管理員,以及開(kāi)發(fā)人員的成本要比Windows平臺(tái)要高很多,并且作為操作系統(tǒng)方面是免費(fèi)的,但是支持幾乎是沒(méi)有的只有一些不適合商業(yè)應(yīng)用的開(kāi)源社區(qū)作為支撐,要得到更加好的服務(wù)或者額外的支持還是得通過(guò)大廠商的高額的產(chǎn)品或服務(wù)來(lái)實(shí)現(xiàn),而Windows平臺(tái)則不同,雖然操作系統(tǒng)貌似價(jià)格不扉,但是本身就帶了很多的模塊,比如組件服務(wù),日志服務(wù)等等,加上平臺(tái)上各種軟件的數(shù)量也和Linux下的不是同一量級(jí)的,可選擇性要大的多,而讓Linuxer所詬病的Win32的安全性其實(shí)完全可以通過(guò)另外獨(dú)立的安全模塊,如硬件防火墻等來(lái)完善,畢竟操作系統(tǒng)不是專(zhuān)門(mén)做安全防護(hù)的Linux也存在很多的漏洞,并且隨著Linux發(fā)行版的日益增多,用戶(hù)的逐漸了解,漏洞也日益的增多.
2.開(kāi)發(fā)效率.無(wú)疑Visual Studio系列開(kāi)發(fā)套件是目前開(kāi)發(fā)領(lǐng)域最方便最強(qiáng)大的IDE環(huán)境,這已是不爭(zhēng)的事實(shí),而如果用VI + GCC的模式去開(kāi)發(fā)LINUX下面的服務(wù)器其效率和質(zhì)量至少?gòu)奈夷壳暗乃?可以部分代表國(guó)內(nèi)目前中小游戲軟件開(kāi)發(fā)商實(shí)際現(xiàn)狀)要徹底的領(lǐng)悟并轉(zhuǎn)換需要一定的時(shí)間,并且還沒(méi)有成熟的開(kāi)發(fā)平臺(tái)作為保證, JAVA好象有 但是C++還沒(méi)有聽(tīng)說(shuō)有超過(guò)VC++的.
posted on 2009-02-12 02:41
小王 閱讀(1891)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
游戲服務(wù)器端開(kāi)發(fā)