游戏后台的架构以及服务器系统是大型游戏开发中一个不可或缺的部分,本期的Live问答栏目中,我们有请到了腾讯互娱服务器专家工程师,腾讯天美工作室技术总监唐健围绕后台架构和分布式系统内容与大家展开分享与讨论,并回答大家提出的疑问。以下是Live的整理内容。

唐健  腾讯互娱服务器专家工程师,腾讯天美工作室技术总监。擅长分布式系统,海量数据处理和FPS游戏服务器。负责过的项目包括《逆战》、《CFM》等等。

唐健:对于游戏后台开发,一般玩家在看到一款好玩的游戏的时候往往不会注意到后台这种东西,更多的会被游戏的画面和玩法吸引,很多游戏像是单机游戏是没有后台的,但是像我们天美的游戏基本都是有后台的。所以在很多 online的游戏里面,后台的存在感会比较弱。但是如果想真正做一款能赚钱、完美的游戏,后台这部分是不可少的。

一般来说,大家所接触到的后台可以分为两个大块。第一个部分就是支撑系统,比如说帐号、聊天、好友、比赛系统等等,这些其实是位于游戏核心玩法之外的部分,一般我们都把他们称为支撑系统。

第二个部分就是和游戏核心玩法相关的系统,像是《逆战》后台BS系统、《王者荣耀》后台的逻辑系统,这部分的系统与游戏的核心玩法密切相关。就以我们射击游戏为例,射击游戏的逻辑服务器是目前最复杂的集中游戏服务器之一,为什么这么说呢?因为其他的逻辑服务器很少在服务器端跑一个模拟真实的游戏场景,而射击游戏要在服务器模拟这局比赛所有人的移动、开火、行为动作等等,所以说是目前最复杂的逻辑服务器之一。

还有的就是休闲类游戏,类似《天天酷跑》这种的游戏。他们的游戏逻辑服务器这款就相对比较简单,因为他们往往只需要做一些后校验,比如说在一局结束后,在逻辑服务器上做一次校验就可以了。

像腾讯的一些大型游戏往往要支持成千上万的人同时在线,所以基本上都是需要上千台服务器作为一个游戏服务的支撑,当然这几千台服务器可能会分布在全国多个地区。我们需要记住的是,服务器不仅仅需要后台软件的支持,同时也是需要一个比较完善的支撑平台。比如说前端网络的接入、带宽、内网体系等等。目前来说。一般大型的公司或者云服务基本上具备了底层了平台的基础特征,所以我们从一个游戏开发者的角度来说,对于底层我们也不需要考虑过多,因为现在这些底层的网络技术以及服务器的选用已经比原来简化了很多。

下面就大家所提出的来问题,进行了以下回答:

1.天美所采用的架构最大支持多少人同时在线不卡?怎么做实时同步?是完全实时同步的吗?超过这个数值有事如何保证服务器稳定和游戏质量的?

唐健:一般来说服务器的扩展能力还是很强的,当然不是无限扩展。这个跟具体的游戏场景和使用情况有关,像是一局比赛的游戏人数以及场景中所能容纳的人数。如果超过了服务器的上限的话,首先我们是考虑从软件上面来优化,如果实在优化不了话,会考虑平行扩展服务器的方式来解决同时在线问题。

2.服务器分布式调度常用策略都有哪些?适用场景呢?分布式架构下怎么使用缓存来提高游戏服务器的性能?有哪些典型的业务可以通过缓存来提高并发的性能?

唐健:一般而言服务器分布式调度常用策略都采用的比较简单,采用顺序或者加权的方式,一般情况下我们很少能做到那么复杂和精确的调度,平常也不太可能需这些。关于缓存,缓存可以分为几种级别,比如说random系统,可以把用户的整个信息放入进去,这样可以明显加快整体的进程。当然也可以在接入层做一层比较小的缓存,这样我们很多时候需要返回信息的话,就不需要网络请求再做一次了。

3.在多服务程序中,如何保证有关联的两条消息依次到达客户端,使用消息队列还是有其他方式?

唐健:其实在实际中,我们应该尽力避免这种关联消失的情况。当然如果实在要有的话,我们可以通过业务端去保证,也就是说我们可以通过一些消息顺序号的方式去保证多个消息的关联性。一般用简单的方式去保证就足够了,因为如果我们考虑的太过复杂,可靠性的问题和开发性的问题也得不到保证,有时候我们能通过一些简单的方式能打到目的就可以了。

4.有没有适合小型初创团队的服务器架构推荐,帧同步和状态同步的开发经验踩过什么雷?

唐健:建议你们起初还是从一些简单的逻辑服务器起步,不要涉及太多很复杂的模型,慢慢来。帧同步和状态同步单一是无法满足业务的需求的,可能会采用折中的方式,在状态同步的时候可能会加入一些帧同步,这个要根据需要来决定。

5.灰度上线的功能具体是如何实现的?

唐健:这个问题适用很多的场景,在接入端的时候,QQ号转让根据接入到的不同的号码,腾讯内部这边接入的QQ号、微信号等来做一个hash,做到某些的hash值的时候,把这部分的流量传到指定的服务器上去做,按照不同的hash值把不同的用户引导到不同的服务器上去,这样就形成了灰度。

对于分区分服来说,灰度测试还是比较好做的,因为可以按需分配功能等。对于全区全服来说,特别是那些复杂业务逻辑的游戏,这个分区分服就很难做了。像是《王者荣耀》是全区全服的,我们给某些人增加了一些英雄,而有的人是没有的,但是一旦他们同时进行游戏的话会出现各种的问题,所以来说全区全服是比较难做的。

6.天美的服务器端是不是都用C++编写的? 遇到需要热更新的情况是怎么处理的?

唐健:天美的服务器大部分都是用C/C++写的,服务器是没有热更新的问题,热更新是客户端上的问题。服务器的热更新要做到让用户基本无感知,也不能太过粗暴,没有任何的提醒与预告。

7.对于在全球部署的分布式服务器(北美、欧洲、亚太等区域),要实现类似全服排行榜功能,排行的数据涉及多个数据表,并且每月为一个赛季,赛季结束排行数据要清零,重新开始新赛季,此种情况下赛季结束时数据库会有大量数据写操作,请问此种情景下,数据库(如mysql)和redis应该采用什么部署策略比较合理?赛季过度期间不想停服应该怎么做?

唐健:这个解决方案有很多种,可以采用缓写的模式,不用一次把数据写完,可以定时定量的完成,避免数据的同时大量写入。

大牛唐健,带你领略游戏服务器与后台架构的奥妙相关推荐

  1. win10系统做游戏服务器吗,win10架构游戏服务器

    win10架构游戏服务器 内容精选 换一换 弹出"创建推理服务"窗口.设置基础配置信息,然后单击"下一步".基础配置信息参数名称参数说明基础配置名称1-50个字 ...

  2. 戴尔r610服务器主板型号,信息时代,带你领略神秘服务器的内部结构(DELL PowerEdge R610)...

    认识众多玩家高手/拆客/DIYer,查阅更多资源,一起学习技术知识 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 Harry_2005 于 2020-11-1 12:30 编辑 ...

  3. python游戏服务器框架_mqant首页、文档和下载 - Golang/python语言开发的分布式游戏服务器框架 - OSCHINA - 中文开源技术交流社区...

    mqant mqant 是一款基于 Golang 语言的简洁,高效,高性能的分布式游戏服务器框架,研发的初衷是要实现一款能支持高并发,高性能,高实时性的游戏服务器框架,也希望 mqant 未来能够做即 ...

  4. 深入浅出Node.js游戏服务器开发--分布式聊天服务器搭建

    From: http://www.infoq.com/cn/articles/game-server-development-2?utm_source=infoq&utm_medium=rel ...

  5. 游戏服务器框架之跨服(一)

    如今的游戏开发,不搞个跨服玩法都不好意思说在做游戏了(当然,也跟游戏类型有关,一些轻度休闲游戏可以排除在外).跨服玩法的设计,可以进一步激发玩家追求高战力的虚荣心,也可以汇聚玩家数量,避免单服日活跃低 ...

  6. 浅谈游戏服务器---功能模块上来看

    游戏服务器在网游上的作用不容考虑,游戏能做大到什么程度,还是有很大的依靠的,这篇文章先从功能模块的角度来谈一个完善的游戏服务器需要实现哪.     一:游戏服务器的作用:连接各个网游客户端,实现各客户 ...

  7. Netty+SpringBoot搭建游戏服务器(带控制台客户端)

    Netty与SpringBoot的游戏服务器 目录 Netty与SpringBoot的游戏服务器 前言 一.项目整体流程 二.项目启动 1.克隆或下载该项目 2.导入idea,或者上一步用idea导入 ...

  8. 游戏服务器为什么选用Actor模型,《百万在线》给你答案

    游戏服务器需要承载很多玩家,开发者需要选择合理的架构.Actor模型是一种常用的游戏服务端架构模型,在选用Skynet.Erlang方案的公司中广泛应用. 从硬件角度看待架构划分 游戏服务端选用的抽象 ...

  9. 游戏思考26:游戏服务器压力测试文档(新增linux相关命令,02/10未完待续)

    文章目录 一.压力测试关注点 二.计算最耗时的加载操作 1)从数据库读取数据,对加载的类型进一步划分各种类型,计算最耗时操作 2)查看CPU随着在线人数的变化所占百分比 3)查看内存变化 4)备注 三 ...

最新文章

  1. 29 仿京东放大镜案例
  2. python使用matplotlib对比多个模型的在训练集上的效果并使用柱状图进行可视化:基于交叉验证的性能均值(mean)和标准差(std)进行可视化分析、使用标准差信息添加误差区间条yerr
  3. anaconda创建菜单失败
  4. Cloudify — REST Plugin
  5. go语言学习(7)锁
  6. 中国SaaS死或生之三:SaaS SCM能否上演绝地求生?
  7. Zookeeper的概述
  8. 获取application server 主机名(host name)和端口号(port)的FM TH_GET_VIRT_HOST_DATA
  9. hal库选择滴答时钟函数_stm32h7“理解hal库框架”
  10. Ubuntu修改默认源为国内
  11. 2017.3.21 树网的核 思考记录
  12. _系列 | 全自动泊车辅助F-APA简介(系列一)
  13. pythonnamedtuple定义类型_python - namedtuple和可选关键字参数的默认值
  14. SRGAN:Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network
  15. 下载kaggle数据集
  16. C1. Simple Polygon Embedding(计算几何)
  17. Windows版navicat11破解
  18. 许三多和他的基金定投
  19. javaweb项目实训总结_java web实训心得体会
  20. 大内密探HMM(转)

热门文章

  1. html select选择事件_用 Java 拿下 HTML,分分钟写个小爬虫
  2. python打印倒等腰梯形,Linux使用shell脚本做的菱形等一些益智题
  3. java字节码常量池_java字节码常量池处理说明
  4. 分支限界法:单源最短路径--dijkstra算法
  5. spring-security问题记录
  6. [JavaScript] 设置函数同名变量为false会导致函数无法执行
  7. winform 自适应屏幕分辨率具体操作和注意事项
  8. 把一个英语句子中的单词次序颠倒后输出。例如输入“how are you”,输出“you are how”;...
  9. Memcached 缓存个体,对象,泛型,表
  10. IE6下绝对定位的高度自适应