浅谈全区全服架构的SNS游戏后台

首先说下分区分服和全区全服的概念,查了一下资料,没有找到合适的定义。说下自己的理解:所有游戏服务器都有玩家数据库,如果以数据库为单位划分 Set ,单 Set 如果能承载超过10万的同时在线,可以认为是全区全服的游戏,10W以下可以认为是分区分服的(10W只是个人的标准)。早些年设计的 mmog 游戏游戏交互频率高,要求网络延迟低,需要就近接入,所以大多采用分区分服的方式。而 SNS 游戏,以好友关系链作为主要玩法,单服需要大量的注册用户,且对网络延迟要求不高,所以大多采用全区全服的方式。

全区全服并不是说一个游戏只有一个大区。比如逆战,分了电信区和网通区两个独立的大区,就近部署服务器,减少网络延迟给玩家的影响,类似的还有 QQ 飞车等。

全区全服的SNS游戏代表有 QQ 农场、摩登城市、夜店之王,分区分服的游戏代表有幻想、御龙在天等。

接下来以摩登城市( QQCity )为例,谈谈在全区全服的 SNS 游戏开发中遇到的问题。QQCity 是一款模拟经营性质的 SNS 休闲游戏,以城市建设为主线,融合偷菜的玩法,最高在线人数上十万,日活跃上百万。后台架构如下图所示,玩家进入游戏,首先通过 DIR 服务器获取 GameServer 的 IP ,建立长连接,所有的游戏逻辑都在 GameServer 上实现,玩家在游戏过程中数据发生变化时通过 DBServe r写入全内存数据库 TMem 。玩家拉取关系链、付费、防沉迷及日志服务器等辅助模块则通过 tbus 组件与 GameSvr 通信。

    

全服全服游戏在设计和部署中一些不同于分区分服的地方,从以下4个方面大概说一下:

一.可扩展性

对于SNS类型的游戏,PCU到达10w甚至100W都是有可能的,所以在服务器设计之初就要考虑所有的功能模块都要具有可平滑扩展的能力。通过上面的架构图我们可以看到,摩登城市的GameSvr、DBSvr、TMEM以及辅助模块都是以服务器组的形式出现的,对于某个功能都有几台服务器一起分担外部的请求。由于SNS游戏的特性,在做扩容的时候最好能做到不停机。

1.逻辑服务器扩容

由于 GameSvr 之间关系相对独立,在不停机增加 GameSvr 的时候我们只需要将新增加的服务器与各个内部的功能模块之间建立通信关系就可以了,摩登城市游戏服务器之间通信使用了 TBus 组件,tbus 支持动态的刷新通道,我们所需要做的工作只是让辅助模块以及 DBSvr 能够动态的发现新增加的 GameSvr,可以通过 reload 或者定时检查的的方式实现。

前面已经说到,登陆游戏首先向 Di r服务器请求 GameSvr 的 IP,所有 GameSvr 向 Dir 定时上报当前负载、提供服务的 IP 和端口,所以新加服务器的就会暴露给外面玩家。

2.功能模块的扩容

DBSvr 与各个辅助模块想要不停机动态扩容的话,相对来说复杂一些。难点在于,新增服务器要分担其他服务器上的负载,要保证服务的无状态性,举例来说:玩家A上次请求是通过 SocialSvr1 拉取好友关系,这次的请求能否通过新增的 Social2 来执行,取决于 SocialSvr1 上是否有保存影响到拉取好友关系的临时信息(如 SessionKey 等),如果没有,说明 SocialSvr2 可以相应A的请求,实现动态扩容。

3.TMem数据库模块

TMem已经实现了动态扩容的功能,并且在运营摩登城市的过程中,经过了实战检验。

二.负载均衡

谈到平滑扩容就必须聊聊负载均衡了,对于同一个功能模块的一组服务器如何实现压力分担,就是个人理解的负载均衡。

1.逻辑服务器(GameSvr)的负载均衡

逻辑服务器是直接与玩家进行网络通信的服务器,实现负载均衡有一些现成的解决方案,如LVS、TGW 等,都可以达到网络层的平均负载。摩登城市没有选用这些方案,而是增加了Dir服务器,可以应用到一些特殊的场景,更加灵活控制每台逻辑服务器是否开启和在线人数。从运营后的数据来看,电信玩家与联通玩家数量比大概为2:1,所以现在外网电信GameSvr的数量是网通的2倍。

2.功能模块的负载均衡

QQCity 采用按 QQ 取模的方式实现,这样做好处有两点:

  • 实现简单,逻辑服务器向后端发送请求时只需要取模的方式确定发送到哪个 IP。
  • 定位问题方便,可以确切的知道处理单个玩家逻辑是哪台服务器。

3.数据库 TMem 本身具有负载均衡的机制。

三.容灾策略

摩登城市的容灾方法基本是依靠心跳包,检测服务器状态实现的。

1.逻辑服务器

上面已经提到,逻辑服务器会定时发送心跳到 DirSvr ,如果某台 GameSvr 出现宕机

或者硬件问题,上报心跳包超时,Dir 就会把它设置为不可用状态,不会再把这台服务器推送给新进玩家。已经连接到这台服务器的玩家通过刷新页面的方式会重新连接到可用服务器。

当这台服务器恢复后,上报心跳包给 DirSvr,DirSvr 将其设置为可用状态。

2.功能模块

所有为其他 Server 提供服务的模块都会有心跳包发到其他 Server ,以便于其他 Server 知道当前模块是否可用。如架构图中所示 SocialServer 会发送心跳包给所有的 GameServer ,如果 SocialServer1 出现故障,心跳包超时,所有 GameSvr 发往 SocialServer1 的请求就会平均的发送到其他的 SocialServer 上,直到 ScocialServer1 恢复工作。

四.服务器部署

玩网游的人都知道一句话,世上最远的距离不是从美国到中国,而是从网通到电信。作为网络游戏的开发者,如果不考虑国内的网络环境,将会死的很惨。一些从国外引入的游戏,都或多或少的面临着网络的考验。

前面已经讲过,SNS 类的游戏对网络延迟的并不是很敏感。所以摩登城市的服务器没有就近部署,而是集中部署在上海市北 DC 和上海江场联通机房。

考虑到电信用户数量要远远大于联通用户,所以所有功能模块、数据库、电信 GameSvr 都部署在上海市北 DC,部分联通的 GameSvr 部署在上海江场机房,联通的 GameSvr 拉取玩家数据以及其他请求通过同城专线。

以上几点是在开发摩登城市过程中的自己的一些心得体会,难免会有偏颇,希望各位大神斧正,有说的不明白的地方欢迎骚扰。最后为现在所做的项目将魂做个广告,将魂是一款三国背景的战棋类回合制网页策略游戏,有风格各异的武将、刺激多样副本和精美的动漫画面风格。既可以游戏中体验经典的三国历史故事,又可以收集各种武将并带领他们去参加各种激烈的战斗哦!

相关推荐

缓存系统在游戏业务中的特异性

如何使用私有网络部署全球同服游戏服务

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

梁本志的专栏

1 篇文章2 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏看看搬搬

物联网的消息传递

为一个物联网用例部署消息代理模块,对于broker接口的可延展性而言会带来新的挑战。我们现在谈论的物联网涉及到数千个连接,消费者和目的,这让我们必须思考如何更仔...

2666
来自专栏即时通讯技术

解密“达达-京东到家”的订单即时派发技术原理和实践

达达-京东到家作为优秀的即时配送物流平台,实现了多渠道的订单配送,包括外卖平台的餐饮订单、新零售的生鲜订单、知名商户的优质订单等。为了提升平台的用户粘性,我们需...

610
来自专栏码神联盟

碎片化 | 第一阶段-02-Java的跨平台性-视频

如清晰度低,可转PC网页观看高清版本: http://v.qq.com/x/page/e05653gnkoa.html Java语言概述 是SUN(斯坦福大学...

3977
来自专栏落影的专栏

三年程序员的日常

前言 汇总平时的一些思考。 正文 如何快速上手一个庞大的工程? 这个问题,我已经经历过多次,现在的方式: 1、整理基本框架,研读代码规范,熟悉团队开发习...

4039
来自专栏架构师小秘圈

有经验的程序员应该如何提升自己

工作1-5年,当我们向老板提出加薪的时候,或者跳槽去“捡”offer的时候,我们底气够吗? 敢不敢不给涨薪,就“挥一挥衣袖,不带走一个bug”?是不是提出要求后...

3085
来自专栏视频直播

世界杯直播技术揭秘及视频云直播回源系统的应用

近些年,视频直播应用蓬勃发展,带宽也是日渐新高,腾讯云旗下的视频云直播为斗鱼、快手、虎牙、龙珠、CNTV广大的企业客户提供了很大的支持,在行业内起到了引领的作用...

792
来自专栏java一日一条

Java开发熟手该当心的11个错误

生产过程中出现的问题正逐渐得到中层和最高管理层的重视。不管是身为开发人员还是架构师,下列的事项都应该得到你足够的重视以避免陷入未来的尴尬境地。你也可以把它作为...

403
来自专栏林喜东的专栏

程序世界里的不信任原则

人与人之间最重要的是信任,但程序的世界里,可能信任越少越好;我越发觉得越是高性能高可用的系统里,不信任原则会体现得更加淋漓尽致。

1.7K5
来自专栏大数据挖掘DT机器学习

关于海量数据处理分析的经验总结

笔者在实际工作中,有幸接触到海量的数据处理问题,对其进行处理是一项艰巨而复杂的任务。原因有以下几个方面: 一、数据量过大,数据中什么情况都可能存在。如果说有10...

3107
来自专栏包子铺里聊IT

浅谈分布式系统设计中的 Strong Consistency VS Eventual Consistency

对于分布式系统设计,数据的一致性 (consistency, 后文均用 consistency 指代) 是一个非常重要的考虑方面。我们来用几篇文章由浅入深的讨论...

3089

扫码关注云+社区