背景

近几年的游戏行业中,出现了各种各样的滚服游戏,包括页游,手游,H5游戏等等。滚服游戏和大服游戏的区别在于同时游戏人数,大服游戏是有很多用户在一起玩,甚至几十上百万玩家。而滚服游戏则一般会设计游戏在线上限,比如3000,达到上限则新开一组服务器,并引导用户进入新区。

滚服模式是游戏类型,技术架构和急功近利的坑钱策略等因素共同决定的,大服游戏包括绝大部分端游,以及类COC这样类型的游戏。另外,虽然像英雄联盟,王者荣耀这样的游戏也分服架构,但是这个并不是我理解中的“滚服游戏“,首先他们虽然分服,但是每个服的人数上限也是可以高达几十万,他们并不会发生频繁的合服情况。而滚服游戏更多是通过游戏策略设计,鼓励玩家花钱走捷径透支游戏生命周期,甚至几天即可独霸一个服务器。从而导致其他玩家望尘莫及,即使是花钱追也性价比极低,还不如进入一个新服重新开始。这就导致了新服一开,玩家即蜂拥而至,争先恐后练级升装备,以求最快速进入排行榜前列,如果努力一番发现落后了,可能就只能坐等下一个新服。这也导致了新服人数火爆,老服慢慢变成人烟凋零的村服,甚至没人的死服。 为了能够节约服务器带宽资源,同时让少数剩余的玩家能够玩得起来,就必须要要进行频繁的合服,把若干个互不相干的服务器玩家,合并到一个服里面;这样又开启一波玩家竞争和收割。

合服

前面提到滚服和大服两种模式,不管是哪种模式,合服的是时候,是需要将多个服的游戏数据合并在一起。不论数据库采用的是mysql,redis或者mongodb,数据库表的合并都是需要做到多服数据合并后的相容问题,不发生冲突或者遗漏。比如mysql,需要保证各个表合并时主键不冲突,如果业务有昵称不重复的设定,还需要保证昵称不重复。有时候合并还需要删除僵尸数据,此时需要注意删除的数据之间的逻辑关系是否一并清除,不能导致数据不一致,比如清除了一个半年不上线的玩家账号数据,但是在好友或者帮派中还残留关系。

单服架构

业务模式在一定程度上会决定技术的选型,在滚服模式里面,游戏的在线人数要求都比较低,通常一个单进程架构就足以支持。所谓单服架构,并不一定整个后台只有一个服务器进程,可能会有其他辅助进程,但是主游戏逻辑只会有一个进程,同时架构也不支持游戏进程伸缩,达到该进程或者物理服务器上限,即从运营上重新开服,引导新的玩家进入新区,单服架构可以简单理解为如下架构模式:

从图中可见,每组服务器有自己独立的游戏进程和数据库,不同服务器之间的用户是物理隔离的。该架构的优势是简单易开发,服务器独立隔离,某组服务器需要停服调整或者宕机,不会影响其他服。缺点也来自单服独立部署,每次开新服都要重新部署数据库和游戏服务整套环境。合服的时候需要进行数据库的物理合并和迁移。

单服架构下的合服,需要进行物理数据库表的硬合并,需要注意主键字段是否冲突。可以通过两种方法防止主键冲突:

合服的时候对所有主键进行修改,特别是uid,保证他们来自不同空间。

在设计之初即考虑合服的问题,从而数据在分配唯一uid的时候,即可为每个服进行分段处理,保证从一开始各个服的主键uid即不会冲突。

合服的步骤和操作一般都比较固定,成熟后可以针对自己特定的业务模式和表结构写脚本统一处理。

大服架构

大服架构区别于单服架构是可以承载更多在线玩家,同时还有一定的伸缩性,一定程度上可以通过不断部署新服务器来扩充在线容量。在滚服模式的游戏中,也可以采用大服的设计思路和架构,从而在运维管理和合服方面得到极大便利,架构示意如下:

当然,该示意图和端游的分布式架构图有相似之处,但是也有所区别,因为此处的业务场景是用在滚服游戏中。该架构是一个原理说明示意,并非是线上运营架构,不同开发者会有不同的具体思路和设计偏好,比如还有类似好友,工会等并未列出,此处仅进行原理说明分析。

从图中可以看出,有多个不同的角色,说明如下:

数据库,整个架构下只有唯一的DB,所有数据都集中保存;

DBServer,所有对数据库的操作都是通过DBServer进行,确保业务逻辑对数据库设计细节的分离;

Account/Name,对用户ID或者昵称的唯一性做保证,这个服务是全大区唯一;

GameServer,游戏逻辑服务,此处每个GameServer即是一个逻辑服,通过不断部署新的GameSever即实现了开服;

Login,登录逻辑和选路分配,此处是一键合服的关键所在,在合服策略配置里面保存了哪个服分配的哪个GameServer游戏进程地址,只需要通过调整这个策略配置即可控制用户进入的GameServer进程;

大服架构用户登录流程:

用户在客户端能登陆界面选择3服的入口,并点击进入游戏。

Login模块收到用户进入s3的请求,从合服策略配置中查询到s3的GameServer入口地址,返回。

客户端收到s3的GameServer地址,直接发起到s3的链接请求。

GameServer3 处理登录请求,并从DBServer获取用户信息返回给用户,没有信息则创建新角色。

登录完成,进入了s3服。

和单服架构的合服区别

单服架构的合服,之所以要进行数据处理和迁移,主要是2个原因:

各个服数据库处于分离状态,需要物理合并到一起

主键唯一ID等信息有冲突,需要数据库修复处理

因为这2个原因,导致单服合服需要做大量的数据处理,导出,拷贝,迁移等,加大了合服操作的流程复杂度和出错的可能。从大服架构图可以发现,单服架构的2个合服难处已经自然消除了。Account分配唯一ID,在DB里面存储自然不会冲突;而且数据本来就放在一个库里面的,不存在需要迁移的问题。

一键合服

通过以上分解可以发现,现在合服会极其方便;不用修改和迁移数据,甚至都不用停服,只需要通过一个工具在合服策略配置库里面对选路信息进行修改,修改用户的登录的游戏服务器。比如提供一个web修改页面,选择s1,s2,s3服合并,默认合并后由gameserver1提供服务,gameserver2和gameserver3即可停止下架,只需要一个http请求,将s2,s3的gameserver地址修改成gameserver1,即实现了合并。

合服后用户登录流程:

用户还是选择3服的入口登录游戏。

Login模块得到用户要进入s3服,查询合服策略配置,得到s3服的服务地址,即gamesrver1,返回。

用户得到gameserver1的地址,发起链接请求,进行登录。

一个游戏大量合服代表什么_浅谈滚服游戏如果实现一键合服相关推荐

  1. mysql数据库合并游戏合服_浅谈滚服游戏如果实现一键合服

    背景 近几年的游戏行业中,出现了各种各样的滚服游戏,包括页游,手游,H5游戏等等.滚服游戏和大服游戏的区别在于同时游戏人数,大服游戏是有很多用户在一起玩,甚至几十上百万玩家.而滚服游戏则一般会设计游戏 ...

  2. unity塔防游戏怪物转向_浅谈塔防游戏的“进化史”,独特创意把“策略至上”推到新的高度...

    塔防游戏的起源是一款叫<堡垒>的街机游戏,虽然说该游戏和目前的塔防游戏还有一些区别,但是目前的塔防游戏基本上都有借鉴这个游戏的内容,说它是塔防游戏的鼻祖也不为过.真正把塔防游戏带到大家面前 ...

  3. mysql数据库合并游戏合服_[转载]浅谈滚服游戏如果实现一键合服

    转载自 石匠的Blog: http://www.bugclosed.com/post/12 背景 近几年的游戏行业中,出现了各种各样的滚服游戏,包括页游,手游,H5游戏等等.滚服游戏和大服游戏的区别在 ...

  4. 浅谈滚服游戏如果实现一键合服

    原文链接:石匠的Blog 背景 近几年的游戏行业中,出现了各种各样的滚服游戏,包括页游,手游,H5游戏等等.滚服游戏和大服游戏的区别在于同时游戏人数,大服游戏是有很多用户在一起玩,甚至几十上百万玩家. ...

  5. 浅谈即时战略游戏在 J2ME 上的实现

     浅谈即时战略游戏在 J2ME 上的实现 <星际>.<魔兽>.<文明>......这些都是PC游戏玩家们耳熟能详的名字,可以说以这些游戏为代表的战略游戏是PC游戏的 ...

  6. 《计算机辅助教学及应用实践研究》,《论文_浅谈计算机辅助教学(定稿)》

    <论文_浅谈计算机辅助教学(定稿)> (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 摘要:计算机辅助教学中要用到多媒体课件 ...

  7. python判断两个对象是否为相等使用的运算符是_Python入门_浅谈逻辑判断与运算符...

    这是关于Python的第6篇文章,主要介绍下逻辑判断与运算符. (一) 逻辑判断: 如果要实现一个复杂的功能程序,逻辑判断必不可少.逻辑判断的最基本标准:布尔类型. 布尔类型只有两个值:True和Fa ...

  8. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  9. 一个游戏大量合服代表什么_[游戏服务器从入门到关门]4.分区分服、连服、合服...

    相信大家都玩过分区分服的游戏,输入账号,选择区服(或是先选择区服,再登录账号,这两个逻辑不同),进入游戏,一刀999. 游戏中的每个区就相当于一个独立世界,每个区的玩家都是隔离开的,大家互不可见,每个 ...

最新文章

  1. C++ 获取当前时间的年,月,日,以及时分秒
  2. 「架构技术专题」如何构建网站高可用架构(详细分析篇)?(6)
  3. [JLOI 2012]树
  4. All is about C!
  5. 荐号 | 11个人工智能与大数据相关的个人、企业优质号
  6. Java String 学习笔记 (一)
  7. kakfa怎么看消息是否堆积_不停的打开微信,只为看你是否更新了消息
  8. 实践案例丨教你一键构建部署发布前端和Node.js服务
  9. docker安装redis,使用jedis轻松操作redis
  10. 用oledb导出数据到excel
  11. 深入解读Linux进程调度系列(1)——调度的初始化
  12. 中国IP对讲产品市场深度研究分析报告
  13. 淘宝补单怎么补才有效果?
  14. 计算机怎样设置桌面照片,怎么把一张照片设置成适合自己电脑桌面的壁纸
  15. android 实现发送彩信方法 (MMS)
  16. 【JavaScript】网页轮播图
  17. D3.js的v5版本入门教程(第一章)—— 如何在项目中使用D3.js
  18. 马云,大数据时代的解析与网销云控
  19. Dictionary常用方法,不积硅步无以至千里
  20. python不可以中文注释的解决办法

热门文章

  1. 【参赛作品31】ODBC驱动连接MogDB/openGauss
  2. Buzz 多用途 WordPress主题[v1.10]
  3. 玩转树莓派---详解树莓派的系统烧录,基础使用及基于树莓派制作手势控制的小车(附详细代码及演示效果)
  4. openfire html5,HTML5来了,7个混合式移动开发框架
  5. python中answer_python新手关于一个实例:提示 answer = input()这行有问题,复制粘贴的,请高手指正...
  6. 统计学习(三):分类
  7. 细胞治疗CAR_T行业深度报告:细胞治疗,七载归来方始坼-20210706-兴业证券
  8. Error while adding the mapper ‘interface xx.xx.xxx.xxxx.xxxx.xxxxxxx‘ to configuration.
  9. 瀑布模型与“V”模式开发模型有何异同?
  10. Scrapy部署蜘蛛爬虫项目