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