当前位置:网站首页>腾讯内部技术:《轩辕传奇》服务器架构演变
腾讯内部技术:《轩辕传奇》服务器架构演变
2022-08-05 05:17:00 【博毅创为游戏圈】
今天给大家分享一下腾讯游戏《轩辕传奇》的服务器架构,讲服务器架构如果只是得一个结果,把架构示意图展示一下,这种没有什么意义,今天我想从一个每个人都会写的最简单的架构模型,如何一步一步的演变成《轩辕传奇》分区分世界的架构。
功能扩展性切分与运维扩展性切分
最简单的游戏服务器,一个进程搞定所有的功能,比如支持500人同时在线,开一个服A对应的玩家称ClientA, Server一个进程,架构如下: ClientA------>Server。如果再开第二个服B,如何处理?
方案1: Server 一个进程同时支持两个服的玩家同时游戏,ClientA/B---->ServerA/B,这样的好处就是跨服通讯非常的方便,在一个进程里面,缺点就是ClientA服的玩家引起的宕机会影响B服的玩家。同一个进程来跑A区,B区,无法发挥服务器的多核优势。那么就会演变成方案2。
方案2:A服玩家由ServerA进程来提供服务,B服玩家由ServerB进程来提供服务,他们部署到一台机器上。这样的相比方案1的优点就是一台机器上实现了扩容,缺点仍然很明显就是如果物理机器坏了,两个服的玩家都不能正常的游戏。
ClientA------>ServerA
ClientB------>ServerB (ServerA,ServerB部署到一台机器上)
再接着演变和拆分,得到方案3。
方案3: 我们把不同的服放到不同的物理机器上,这样不同的服就真正的独立起来。
ClientA------>ServerA
ClientB------>ServerB (ServerA,ServerB部署到不同机器上)
总结一下,方案1到方案2叫做功能可扩展性切分,方案2到方案3叫做运维扩展性切分。
分离公共服
不同的服部署到不同的物理机器上,不同服之间有一些公共的服务,不用每个服的实现一个,每个服都架设一个,所以把这些公共的服务里单独分离出来,于是架构演变成如下:
这个时候公共服就是全局唯一的,多个服共用,它就变成了一个单点,公共服的单点故障怎么办?单点故障常用的解决方案就是主-备-从。
按功能分离每个服
上面轩辕里面所说的每个服都按照固定的功能来来分三层: 连接层(tconnd),逻辑层(logic srv), 存储层(torm svr)如下图
那么随之而来的问题又来了,逻辑处理与数据持久化在一台物理机器上,会到导致DB的文件IO拖慢整个系统(每个服百万级玩家,几百个G的数据)。进程运行中每日输出大量的日志,像轩辕每天日志量可达几个G的数据。更致命的是如果物理机器崩溃,数据库中的商业数据随时会丢失,商业数据丢失在长期运营的过程中已经可以算一个很严重的运营事故。所以每个服的架构又会做后面的演变。
按重要性分离:分离逻辑计算与持久化存储部署
游戏运行中的重要数据包括了日志与数据库数据,我们讲这些重要性的数据需要持久化存储部署的与逻辑计算分离开来,重要的数据采用主-备-从的方式,确保商业数据的稳定性。那么我们的服务器每个服务的架构演变如下:
分区多世界原型演变
总结上面的演变,我们把整个轩辕的架构图放出来给大家,存储与逻辑分离,每个服按功能分成3部分。Cluster级服,全局只有唯一的一个,World级服,每个世界一组,每个服,包含接入,逻辑,存储。存储做好分离,做好DB, DR。
公共服进一步分离
大体的架构定下来了,接下来就是分离一些轩辕里面功能部分,先来分离公共服。如下图
我们把公共服的一些固定功能,单独的拆分出来不同的服务进程,来提供对应的服务,比如目录服,
版本升级,账号服务等。这样把公共服拆分成了一套进程。运维的时候根据运维需求来把公共服部署一套机器。
切分轩辕逻辑进程
当前服的所有玩家都在一个进程上,好处就是可以方便的操作到所有玩家,风险也是有的,一个特性的bug会影响到当前进程上所有其它特性的玩家。接下来我们把逻辑进程来进行拆分,MMORPG里面拆分逻辑进程常用的方法是按照场景来拆,那么我们的架构演变如下,把逻辑拆分成世界+多个Scene,如下:
让多个Scene分别服务一些用户,World负责拉取数据,协调控制所有的Scene。游戏开发和其它应用用开发最大的不一样就是,一个产品上线了,结合玩家玩家运营,要经常改,上线了才刚刚开始,所有的功能和特性在一个进程里面,不断的更新特性会使得稳定性降低,所以我们把那些相对更新少的功能拆分独立出来,提升更新对系统稳定性造成的风险。
总结
最后总结一下,游戏框架如何切分,在轩辕中得到的一些总结经验,分享出来,供大家参考:
为可扩展性: 一组服,一套进程;
为可运维性: 一组服,一套机器;
为可靠性: 弱相关的功能分离;
提高更新的便利性: 将平凡更新的部分分离;
按服务的重要性切分: 支付系统独立;
按服务特点切分: 接入,存储, 逻辑分离;
切分稳定 (基础功能)的与不稳定(业务逻辑)的
好了,今天的《轩辕传奇》架构演变就分享到这里了,我详细的讲解了一节课程,除了分析演变以外,还分享了长线运营中的一些经验,分享给没有开发过大型玩家在线游戏的开发者。
边栏推荐
猜你喜欢
【3D模型教程】ZBrush如何表现皮肤纹理?
LeetCode刷题之第701题
【UiPath2022+C#】UiPath If条件语句
伪RTOS-ProroThread在CH573芯片上的移植
LeetCode刷题之第86题
You should write like this
[Database and SQL study notes] 9. (T-SQL language) Define variables, advanced queries, process control (conditions, loops, etc.)
[Pytorch study notes] 11. Take a subset of the Dataset and shuffle the order of the Dataset (using Subset, random_split)
十一、拦截器运行原理
九、响应处理——内容协商底层原理
随机推荐
SharedPreferences and SQlite database
【ts】typescript高阶:键值类型及type与interface区别
【UiPath2022+C#】UiPath If条件语句
吞吐?带宽?傻傻分不清楚
电子产品量产工具(4)-UI系统实现
OSPF网络类型
LeetCode刷题之第24题
LeetCode刷题之第33题
(C语言)动态内存管理
Tensorflow steps on the pit notes and records various errors and solutions
C语言程序死循环问题解析——变量被修改
最简单的防抖节流理解法
LeetCode刷题之第54题
每日一题-最长回文子串-0714
LeetCode刷题之第23题
【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera
【ts】typeScript高阶:any和unknown
ACL 的一点心得
【ts】typescript高阶:映射类型与keyof
原型版本管理