版权声明:本文由梁本志原创文章,转载请注明出处: 
文章原文链接:https://www.qcloud.com/community/article/198

来源:腾云阁 https://www.qcloud.com/community

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

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

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

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

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

一.可扩展性

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

1.逻辑服务器扩容

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

前面已经说到,登陆游戏首先向Dir服务器请求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拉取玩家数据以及其他请求通过同城专线。

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

分享至

  

浅谈全区全服架构的SNS游戏后台的更多相关文章

  1. 游戏全区全服和分区分服 QQ斗地主的设计

    游戏全区全服和分区分服  QQ斗地主的设计 https://cloud.tencent.com/community/article/164816001481011910?fromSource=gwzc ...

  2. 五分钟DBA:浅谈伪分布式数据库架构

    [IT168 技术]12月25日消息,2010互联网行业技术研讨峰会今日在上海华东理工大学召开.本次峰会以“互联网行业应用最佳实践”为主题,定位于互联网架构设计.应用开发.应用运维管理,同时,峰会邀请 ...

  3. 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

    本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)--requirejs + angular + a ...

  4. 浅谈大型web系统架构

    动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...

  5. 转:浅谈大型web系统架构

    浅谈大型web系统架构 动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应 ...

  6. AngularJS进阶(二十五)requirejs + angular + angular-route 浅谈HTML5单页面架构

    requirejs + angular + angular-route 浅谈HTML5单页面架构 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又 ...

  7. 【ZZ】浅谈大型web系统架构 | 菜鸟教程

    浅谈大型web系统架构 http://www.runoob.com/w3cnote/large-scale-web-system-architecture.html

  8. 浅谈HTML5单页面架构(一)——requirejs + angular + angular-route

    心血来潮,打算结合实际开发的经验,浅谈一下HTML5单页面App或网页的架构. 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又要数单页面架构体验 ...

  9. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

随机推荐

  1. shell脚本之间互相调用

    在Shell中要如何调用别的shell脚本,或别的脚本中的变量,函数呢? 方法一: . ./subscript.sh 方法二: source ./subscript.sh 注意: .两个点之间,有空格 ...

  2. RabbitMQ术语

    工作队列:Working Queue 分配:多个客户端接收同一个Queue,如何做负载均衡(分配).     Round-robin分配:多个接收端接收同一个Queue时,采用了Round-robin ...

  3. response.sendRedirect()重新定向的乱码问题

    这里response.sendRedirect("YPbianhaoModify.jsp?jinhuoshang="+jinhuoshang+"&jinhuori ...

  4. Struts2的标签库(三)——控制标签

    Struts2的标签库(三) --控制标签 1.if/elseif/else标签 用于分支控制,取代JSP中的if语句,根据一个boolean(test属性的值)值判断是否进行下一步运算或者输出等. ...

  5. Device Tree(一):背景介绍

    一.前言 作为一个多年耕耘在linux 2.6.23内核的开发者,各个不同项目中各种不同周边外设驱动的开发以及各种琐碎的.扯皮的俗务占据了大部分的时间.当有机会下载3.14的内核并准备学习的时候,突然 ...

  6. BZOJ 3534 重建

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3534 题意:给定一个无向图,每条边有选择概率P:求选出的边恰是一棵生成树的概率. 思路: ...

  7. 【转载】CMake 简介和 CMake 模板

    转载自我的博客: CMake 简介和 CMake 模板 . 如果你用 Linux 操作系统,使用 cmake 会简单很多,可以参考一个很好的教程: CMake 入门实战 | HaHack .如果你用 ...

  8. MySQL(六) —— 自定义函数

    自定义函数 用户自定义函数(user-defined function, UDF)是一种对MySQL扩展的途径,其用法与内置函数相同. 参数,返回值 创建自定义函数 CREATE FUNCTION f ...

  9. [HRBUSTOJ1476]Pairs(FFT)

    题目链接:http://acm-software.hrbust.edu.cn/problem.php?id=1476 题意:给n个数,m次询问,每次询问一个k.问n个数里两数之和严格小于k的数对. 根 ...

  10. HDU 5038 Grade(分级)

    Description 题目描述 Ted is a employee of Always Cook Mushroom (ACM). His boss Matt gives him a pack of ...