版權聲明:本文由梁本志原創文章,轉載請註明出處:
文章原文連接:https://www.qcloud.com/community/article/198數據庫
來源:騰雲閣 https://www.qcloud.com/community後端
首先說下分區分服和全區全服的概念,查了一下資料,沒有找到合適的定義。說下本身的理解:全部遊戲服務器都有玩家數據庫,若是以數據庫爲單位劃分Set,單Set若是能承載超過10萬的同時在線,能夠認爲是全區全服的遊戲,10W如下能夠認爲是分區分服的(10W只是我的的標準)。早些年設計的mmog遊戲遊戲交互頻率高,要求網絡延遲低,須要就近接入,因此大多采用分區分服的方式。而SNS遊戲,以好友關係鏈做爲主要玩法,單服須要大量的註冊用戶,且對網絡延遲要求不高,因此大多采用全區全服的方式。服務器
全區全服並非說一個遊戲只有一個大區。好比逆戰,分了電信區和網通區兩個獨立的大區,就近部署服務器,減小網絡延遲給玩家的影響,相似的還有QQ飛車等。網絡
全區全服的SNS遊戲表明有QQ農場、摩登城市、夜店之王,分區分服的遊戲表明有幻想、御龍在天等。架構
接下來以摩登城市(QQCity)爲例,談談在全區全服的SNS遊戲開發中遇到的問題。QQCity是一款模擬經營性質的SNS休閒遊戲,以城市建設爲主線,融合偷菜的玩法,最高在線人數上十萬,日活躍上百萬。後臺架構以下圖所示,玩家進入遊戲,首先經過DIR服務器獲取GameServer的IP,創建長鏈接,全部的遊戲邏輯都在GameServer上實現,玩家在遊戲過程當中數據發生變化時經過DBServer寫入全內存數據庫TMem。玩家拉取關係鏈、付費、防沉迷及日誌服務器等輔助模塊則經過tbus組件與GameSvr通訊。
負載均衡
全服全服遊戲在設計和部署中一些不一樣於分區分服的地方,從如下4個方面大概說一下:spa
對於SNS類型的遊戲,PCU到達10w甚至100W都是有可能的,因此在服務器設計之初就要考慮全部的功能模塊都要具備可平滑擴展的能力。經過上面的架構圖咱們能夠看到,摩登城市的GameSvr、DBSvr、TMEM以及輔助模塊都是以服務器組的形式出現的,對於某個功能都有幾臺服務器一塊兒分擔外部的請求。因爲SNS遊戲的特性,在作擴容的時候最好能作到不停機。設計
因爲GameSvr之間關係相對獨立,在不停機增長GameSvr的時候咱們只須要將新增長的服務器與各個內部的功能模塊之間創建通訊關係就能夠了,摩登城市遊戲服務器之間通訊使用了TBus組件,tbus支持動態的刷新通道,咱們所須要作的工做只是讓輔助模塊以及DBSvr可以動態的發現新增長的GameSvr,能夠經過reload或者定時檢查的的方式實現。日誌
前面已經說到,登錄遊戲首先向Dir服務器請求GameSvr的IP,全部GameSvr向Dir定時上報當前負載、提供服務的IP和端口,因此新加服務器的就會暴露給外面玩家。遊戲
DBSvr與各個輔助模塊想要不停機動態擴容的話,相對來講複雜一些。難點在於,新增服務器要分擔其餘服務器上的負載,要保證服務的無狀態性,舉例來講:玩家A上次請求是經過SocialSvr1拉取好友關係,此次的請求可否經過新增的Social2來執行,取決於SocialSvr1上是否有保存影響到拉取好友關係的臨時信息(如SessionKey等),若是沒有,說明SocialSvr2能夠相應A的請求,實現動態擴容。
TMem已經實現了動態擴容的功能,而且在運營摩登城市的過程當中,通過了實戰檢驗。
談到平滑擴容就必須聊聊負載均衡了,對於同一個功能模塊的一組服務器如何實現壓力分擔,就是我的理解的負載均衡。
邏輯服務器是直接與玩家進行網絡通訊的服務器,實現負載均衡有一些現成的解決方案,如LVS、TGW 等,均可以達到網絡層的平均負載。摩登城市沒有選用這些方案,而是增長了Dir服務器,能夠應用到一些特殊的場景,更加靈活控制每臺邏輯服務器是否開啓和在線人數。從運營後的數據來看,電信玩家與聯通玩家數量比大概爲2:1,因此如今外網電信GameSvr的數量是網通的2倍。
QQCity採用按QQ取模的方式實現,這樣作好處有兩點:
摩登城市的容災方法基本是依靠心跳包,檢測服務器狀態實現的。
上面已經提到,邏輯服務器會定時發送心跳到DirSvr,若是某臺GameSvr出現宕機
或者硬件問題,上報心跳包超時,Dir就會把它設置爲不可用狀態,不會再把這臺服務器推送給新進玩家。已經鏈接到這臺服務器的玩家經過刷新頁面的方式會從新鏈接到可用服務器。
當這臺服務器恢復後,上報心跳包給DirSvr,DirSvr將其設置爲可用狀態。
全部爲其餘Server提供服務的模塊都會有心跳包發到其餘Server,以便於其餘Server知道當前模塊是否可用。如架構圖中所示SocialServer會發送心跳包給全部的GameServer,若是SocialServer1出現故障,心跳包超時,全部GameSvr發往SocialServer1的請求就會平均的發送到其餘的SocialServer上,直到ScocialServer1恢復工做。
玩網遊的人都知道一句話,世上最遠的距離不是從美國到中國,而是從網通到電信。做爲網絡遊戲的開發者,若是不考慮國內的網絡環境,將會死的很慘。一些從國外引入的遊戲,都或多或少的面臨着網絡的考驗。
前面已經講過,SNS類的遊戲對網絡延遲的並非很敏感。因此摩登城市的服務器沒有就近部署,而是集中部署在上海市北DC和上海江場聯通機房。
考慮到電信用戶數量要遠遠大於聯通用戶,因此全部功能模塊、數據庫、電信GameSvr都部署在上海市北DC,部分聯通的GameSvr部署在上海江場機房,聯通的GameSvr拉取玩家數據以及其餘請求經過同城專線。
以上幾點是在開發摩登城市過程當中的本身的一些心得體會,不免會有偏頗,但願各位大神斧正,有說的不明白的地方歡迎騷擾。最後爲如今所作的項目將魂作個廣告,將魂是一款三國背景的戰棋類回合制網頁策略遊戲,有風格各異的武將、刺激多樣副本和精美的動漫畫面風格。既能夠遊戲中體驗經典的三國曆史故事,又能夠收集各類武將並帶領他們去參加各類激烈的戰鬥哦!