想要遊戲火爆,熱度經久不衰,聯機必不可少。而聯機遊戲對於遊戲低延時、服務穩定、成本控制有很高的要求,對於研發、運維挑戰很大。
騰訊遊戲伺服器引擎(Game Server Engine,縮寫GSE),支援有狀態的遊戲服務部署和擴縮容,實現服務發現、高效靈活的伺服器伸縮和就近排程的能力,幫助開發者快速構建穩定、低延時的多人遊戲的部署環境,並節約大量的運維成本,下文將為大家全方位講解和分析。
一、聯機對戰類遊戲的需求
聯機對戰類包含FPS、MOBA、休閒IO、體育競技、棋牌、策略等需要與人一起玩,一定時間就結束的遊戲。
1. 遊戲低延時,保障更多玩家流暢的體驗
全球玩家分佈廣泛,而伺服器集中部署,會使部分地區網路體驗差,遊戲體驗受到影響,這也是部分地區玩家數量相對較少的一個原因。
有沒什麼辦法,可以降低延時,儘量讓更多玩家加入進來呢?
通常採用就近排程,或者全球加速(集中部署在一個點,各個區域到此點進行加速)的策略,可以讓網路延時達到一個優化。對於實時性非常敏感的遊戲來說,就近排程效果更明顯。
不過就近排程也有幾個棘手的問題:
方案一:業務部署在多個區域,玩家就近在一個區域完成匹配和對戰。
問題:某個區域的玩家相對較少,可能匹配不到相應等級的人,最後所有玩家都集中到某個大區去了,實際上又變成了集中部署。
方案二:匹配在一個大區進行,集中匹配,對戰的時候就近分配到不同的地區。
問題:匹配時哪些區域會被匹配在一起是不確定的,而且也存在大量邀請好友一起玩的行為,每一天被分配到各個大區的玩家數量可能會非常不一樣,各個大區的伺服器需求量不能提前準確預估。準備少了不夠,準備多了浪費資源。為了實時滿足就近排程,可能每個區域都要最大量的準備伺服器,致使伺服器成本暴增。
最後實際方案:可能變成集中排程了,對於中國區來說,所有的服務部署到上海。
2. 服務穩定,保障玩家體驗和多創營收
在保障服務穩定和玩家體驗方面,也會遇到以下挑戰:
(1)爆發式增長,不能及時擴容承接更多玩家
為了響應爆發式增長,研發和運維都需要提前做很多工作:確保服務能平行擴充套件,通過新增伺服器,可以讓遊戲無上限的支撐玩家。
這是一個有狀態的擴縮容場景:對於遊戲服務,尤其是對戰服務來說,不能是簡單新增一個CLB(負載均衡)就能搞定。在遊戲服務裡需要斷線重連,能找到之前連線的伺服器;另外遊戲過程不能因為縮容中斷遊戲。
研發側:服務註冊、服務發現、服務排程,服務管理等工作,以確保服務能自動化的平行擴容,否則只能靠手工配置。為了保障穩定性需要檢查服務健康狀況,遮蔽不健康服務,以及服務保護工作避免遊戲中的服務被中斷。
運維側:需要寫一些指令碼去新增更多伺服器,需要寫一些工具讓伺服器自動伸縮。自動化進行,需要制定伺服器伸縮策略、研發伺服器自動購買、故障伺服器排除等工具。
即使做好上面準備工作的情況下,還有可能會出現異常情況:
在伺服器分配過程中,排程指標一般以伺服器的指標CPU、記憶體作為參考,這樣可能導致一些低CPU、低記憶體的服務短時間被大量分配出去,伺服器訪問量瞬間爆發式上漲而掛掉。為了避免這種情況,通常CPU的利用率會維持在不高的狀態。
這件事,無論是研發還是運維,都不是一件簡單的事。工作量比較大,前期不確定遊戲是否會爆發式增長,一般中小開發者也不會提前做這些準備。
(2)地域/伺服器發生故障
伺服器發生故障比較常見,通常做法就是監控伺服器,出現故障立即剔除掉。
地域或整個機房發生故障不常見,但造成的影響面積非常寬廣,一般遊戲開發者不太會考慮這個點,因為要做伺服器跨地域或者跨機房容災,至少要2倍的伺服器,投入產出相對較低。
3. 成本節約
伺服器空閒導致的成本,主要有如下這些情況:
-
每日&週末&節假日的高峰波谷時的資源空閒
-
遊戲穩定運營及下降期,伺服器空閒資源
-
活動期間,爆發增長,活動過後資源空閒
比起遊戲運營成本來說,伺服器成本算不了什麼,但是,能省一點是一點,是不是?
二、對研發和運維的挑戰
如前文所述,為了提升遊戲的一點體驗,會導致研發工作量大、運維工作量大、伺服器成本大。
1. 研發工作量大
服務管理、就近排程、跨地容災、不停服更新、自動伸縮,對研發的工作量要求極大,不少大廠已經逐步在完善這些配套工具。對於一些創新工作室,或者創業者,會把更多精力放在打造遊戲業務上,做這些工作是一種負擔。
2. 運維工作量大
反覆去做擴容、縮容、釋出版本。如果不反覆去做這些事,需要開發一些工具/指令碼,是需要較大前期投入的事情。
3. 伺服器成本大
一是來自空閒資源的成本,二是按照傳統方式就近排程、跨地容災至少需要增加1倍伺服器成本。
三、GameServerEngine解決方案
騰訊遊戲伺服器引擎(Game Server Engine,縮寫GSE)提供專用遊戲的伺服器託管服務,支援有狀態的遊戲服務部署和擴縮容,實現服務發現、高效靈活的伺服器伸縮和就近排程的能力,幫助開發者快速構建穩定、低延時的多人遊戲的部署環境,並節約大量的運維成本。
支援Unity引擎、Unreal引擎和自定義遊戲框架的部署和執行,應用於 FPS、MOBA、回合制、MMORPG、棋牌遊戲中戰鬥服、訊息 PUSH 等需要保持狀態的場景。
1. 彈性伸縮
遊戲每天會有高峰、波谷,每年也會有節假日,週末等不同的玩家曲線動態變化,對伺服器的伸縮排程能力有著很高的要求,而GSE最核心的能力就是彈性伸縮和資源排程能力。
遊戲日每日波動曲線
遊戲每年波動曲線
(1)GSE能將伺服器實時伸縮
GSE 可設定伺服器例項型別和伸縮範圍,例項將在這個範圍內進行伸縮。遊戲的訪問每天都有高峰和低谷,通常在中午和晚上時,伺服器例項的數量將有一個高峰,在午夜後,伺服器例項的數量會降到最低。GSE 將根據每天每個時刻伺服器的訪問量進行自動伸縮。
(2)GSE能實現有狀態的縮容
GSE 不會縮減有程式執行的例項,低負載觸發縮容時通知遊戲程式正在縮容該臺伺服器,並遮蔽新的遊戲伺服器會話分配到該臺伺服器上,但不強制縮減例項導致遊戲無法進行,等待遊戲程式上沒有玩家在對局時,發起結束指令後,才真正觸發停止程式和伺服器的回收。
彈性伸縮的好處是:
a. 提高靈活性
-
就近排程,需要時去拿伺服器,不需要時退回伺服器。
-
容災也是一樣,需要時去拿伺服器,不需要時退回伺服器。
b. 節省成本
-
減少每天、每週、每年空閒資源成本,經計算可節省20%-30%的成本
-
減少就近排程的成本
-
減少容災的成本
2. 就近排程
彈性伸縮是一個基本前提,強大的排程資源能力在此基礎上延伸,可以隨時排程騰訊雲各個區域的資源,從而不需要在各個區域提前預留伺服器資源,這讓就近排程變得簡單。
GSE提供客戶端到服務端的測速,獲得客戶端到所有服務部署區域的延時,GSE通過這個延時情況進行就近排程。
如下圖所示,可以看到一組匹配好的玩家,會被分配到最近的伺服器進行對戰。北京、上海、廣州、成都剛開始都可以部署1臺伺服器,和配置好伸縮策略,這樣在需要時就能自動伸縮。
3. 多地部署,跨區域容災
彈性伸縮是一個基本前提,GSE可以隨時排程騰訊雲任何區域、任何機型的資源,從而輕鬆做到容災。
遊戲伺服器佇列下面包含了各個區域的遊戲伺服器艦隊(一組伺服器),業務只需要請求遊戲伺服器佇列,遊戲伺服器佇列會根據每組遊戲伺服器艦隊的健康狀態和客戶端到伺服器的網路延時情況,會自動剔除到有問題的區域,選擇正常的伺服器來提供服務,正常區域如果需求旺盛,則會自動擴容。不需要提前在多個區域部署相同數量的伺服器,從而達到0成本容災的效果。
4. GSE和普通彈性伸縮的區別
GSE專注於有狀態擴縮容場景。
遊戲中通常會有兩個特殊需求:斷線重連、遊戲中不能退出。而一般遊戲伺服器都是有狀態的,那麼該如何進行縮容呢?
GSE的設計對遊戲伺服器有三種保護策略:
(1) 全保護 :如果有程式在執行的話,則不會縮容。
(2)不保護:需要縮容時,立即縮容。
(3)時限保護:保護一定期限,比如1個小時。
5. GSE不停服更新設計
GSE擁有極致的資源排程能力,能夠輕鬆做到更新不停服。
客戶端通過別名alias請求伺服器艦隊fleetA下的伺服器,版本更新的時候,新建伺服器艦隊fleetB,把版本釋出到fleetB上,並把別名alias指向新建的伺服器艦隊fleetB,客戶端仍然呼叫同一個別名alias,但訪問到fleetB的版本了。FleetB逐漸擴容,fleetA逐漸縮容。
以上就是對遊戲伺服器引擎Game Server Engine的設計簡介。您也可以單獨使用彈性伸縮、彈性伸縮+就近排程、彈性伸縮+容災。該產品不侵入遊戲框架、邏輯程式碼,支援unity引擎、unreal引擎,自定義伺服器框架、開源框架執行,支援C++、C#語言,支援JAVA、PHP、python、lua、Nodejs等支援grpc的語言。
如果您的遊戲正在立項、選型中,你會選擇這個全新的遊戲部署框架嗎?