想要游戏火爆,热度经久不衰,联机必不可少。而联机游戏对于游戏低延时、服务稳定、成本控制有很高的要求,对于研发、运维挑战很大。
腾讯游戏服务器引擎(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的语言。
如果您的游戏正在立项、选型中,你会选择这个全新的游戏部署框架吗?