高性能的網絡遊戲服務器的設計

http://blog.csdn.net/yangsf5/article/details/1825197

說起高性能的網絡遊戲,有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++的.


發佈了10 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章