程序丨大牛唐健,带你领略游戏服务器与后台架构的奥妙
游戏后台的架构以及服务器系统是大型游戏开发中一个不可或缺的部分,本期的Live问答栏目中,我们有请到了腾讯互娱服务器专家工程师,腾讯天美工作室技术总监唐健围绕后台架构和分布式系统内容与大家展开分享与讨论,并回答大家提出的疑问。以下是Live的整理内容。
唐健
腾讯互娱服务器专家工程师,腾讯天美工作室技术总监。擅长分布式系统,海量数据处理和FPS游戏服务器。负责过的项目包括《逆战》、《CFM》等等。
唐健:对于游戏后台开发,一般玩家在看到一款好玩的游戏的时候往往不会注意到后台这种东西,更多的会被游戏的画面和玩法吸引,很多游戏像是单机游戏是没有后台的,但是像我们天美的游戏基本都是有后台的。所以在很多 online的游戏里面,后台的存在感会比较弱。但是如果想真正做一款能赚钱、完美的游戏,后台这部分是不可少的。
一般来说,大家所接触到的后台可以分为两个大块。第一个部分就是支撑系统,比如说帐号、聊天、好友、比赛系统等等,这些其实是位于游戏核心玩法之外的部分,一般我们都把他们称为支撑系统。
第二个部分就是和游戏核心玩法相关的系统,像是《逆战》后台BS系统、《王者荣耀》后台的逻辑系统,这部分的系统与游戏的核心玩法密切相关。就以我们射击游戏为例,射击游戏的逻辑服务器是目前最复杂的集中游戏服务器之一,为什么这么说呢?因为其他的逻辑服务器很少在服务器端跑一个模拟真实的游戏场景,而射击游戏要在服务器模拟这局比赛所有人的移动、开火、行为动作等等,所以说是目前最复杂的逻辑服务器之一。
还有的就是休闲类游戏,类似《天天酷跑》这种的游戏。他们的游戏逻辑服务器这款就相对比较简单,因为他们往往只需要做一些后校验,比如说在一局结束后,在逻辑服务器上做一次校验就可以了。
像腾讯的一些大型游戏往往要支持成千上万的人同时在线,所以基本上都是需要上千台服务器作为一个游戏服务的支撑,当然这几千台服务器可能会分布在全国多个地区。我们需要记住的是,服务器不仅仅需要后台软件的支持,同时也是需要一个比较完善的支撑平台。比如说前端网络的接入、带宽、内网体系等等。目前来说。一般大型的公司或者云服务基本上具备了底层了平台的基础特征,所以我们从一个游戏开发者的角度来说,对于底层我们也不需要考虑过多,因为现在这些底层的网络技术以及服务器的选用已经比原来简化了很多。
下面就大家所提出的来问题,进行了以下回答:
1.天美所采用的架构最大支持多少人同时在线不卡?怎么做实时同步?是完全实时同步的吗?超过这个数值有事如何保证服务器稳定和游戏质量的?
唐健:一般来说服务器的扩展能力还是很强的,当然不是无限扩展。这个跟具体的游戏场景和使用情况有关,像是一局比赛的游戏人数以及场景中所能容纳的人数。如果超过了服务器的上限的话,首先我们是考虑从软件上面来优化,如果实在优化不了话,会考虑平行扩展服务器的方式来解决同时在线问题。
2.服务器分布式调度常用策略都有哪些?适用场景呢?分布式架构下怎么使用缓存来提高游戏服务器的性能?有哪些典型的业务可以通过缓存来提高并发的性能?
唐健:一般而言服务器分布式调度常用策略都采用的比较简单,采用顺序或者加权的方式,一般情况下我们很少能做到那么复杂和精确的调度,平常也不太可能需这些。关于缓存,缓存可以分为几种级别,比如说random系统,可以把用户的整个信息放入进去,这样可以明显加快整体的进程。当然也可以在接入层做一层比较小的缓存,这样我们很多时候需要返回信息的话,就不需要网络请求再做一次了。
3.在多服务程序中,如何保证有关联的两条消息依次到达客户端,使用消息队列还是有其他方式?
唐健:其实在实际中,我们应该尽力避免这种关联消失的情况。当然如果实在要有的话,我们可以通过业务端去保证,也就是说我们可以通过一些消息顺序号的方式去保证多个消息的关联性。一般用简单的方式去保证就足够了,因为如果我们考虑的太过复杂,可靠性的问题和开发性的问题也得不到保证,有时候我们能通过一些简单的方式能打到目的就可以了。
4.有没有适合小型初创团队的服务器架构推荐,帧同步和状态同步的开发经验踩过什么雷?
唐健:建议你们起初还是从一些简单的逻辑服务器起步,不要涉及太多很复杂的模型,慢慢来。帧同步和状态同步单一是无法满足业务的需求的,可能会采用折中的方式,在状态同步的时候可能会加入一些帧同步,这个要根据需要来决定。
5.灰度上线的功能具体是如何实现的?
唐健:这个问题适用很多的场景,在接入端的时候,根据接入到的不同的号码,腾讯内部这边接入的QQ号、微信号等来做一个hash,做到某些的hash值的时候,把这部分的流量传到指定的服务器上去做,按照不同的hash值把不同的用户引导到不同的服务器上去,这样就形成了灰度。
对于分区分服来说,灰度测试还是比较好做的,因为可以按需分配功能等。对于全区全服来说,特别是那些复杂业务逻辑的游戏,这个分区分服就很难做了。像是《王者荣耀》是全区全服的,我们给某些人增加了一些英雄,而有的人是没有的,但是一旦他们同时进行游戏的话会出现各种的问题,所以来说全区全服是比较难做的。
6.天美的服务器端是不是都用C++编写的? 遇到需要热更新的情况是怎么处理的?
唐健:天美的服务器大部分都是用C/C++写的,服务器是没有热更新的问题,热更新是客户端上的问题。服务器的热更新要做到让用户基本无感知,也不能太过粗暴,没有任何的提醒与预告。
7.对于在全球部署的分布式服务器(北美、欧洲、亚太等区域),要实现类似全服排行榜功能,排行的数据涉及多个数据表,并且每月为一个赛季,赛季结束排行数据要清零,重新开始新赛季,此种情况下赛季结束时数据库会有大量数据写操作,请问此种情景下,数据库(如mysql)和redis应该采用什么部署策略比较合理?赛季过度期间不想停服应该怎么做?
唐健:这个解决方案有很多种,可以采用缓写的模式,不用一次把数据写完,可以定时定量的完成,避免数据的同时大量写入。
除了以上内容之外,唐健还在Live中回答了一些问题,让大家纷纷表示受益良多,比如:
游戏服务器有好用的类似服务器引擎这样的东西吗?或者是说有没有往标准化发展这样一个趋势?
如果客户端用UNITY3D开发,那后台建议用什么引擎处理战斗逻辑?我们是使用photon 如果客户端用UE4开发,那么后台是使用UE4的处理逻辑?(逆战UE3)
如果对于小团队,做FPS手游,您建议用什么客户端和什么后台战斗逻辑引擎?
想知道他是怎么回答的吗?点击阅读原文,查看本期Live的完整回顾吧!
----------------------
今日推荐
添加小编微信,可享双重福利
1.加入GAD程序猿交流基地
获取行业干货资讯,观看大牛分享直播
2.领取60G独家程序资料库,地址在小编朋友圈
包括腾讯内部分享、文章教程、视频教程等全套资料
↓长按添加小编GAD苏苏↓