最近这段时间,IT行业发展之迅猛。计算机也从最开始的“毒害青少年的罪魁祸首”变成了各行各业都离不开的工具。在这个过程中,网络游戏也变得容易让人接受了,再也不像二十年前一样,如过街老鼠,人人喊打。现在的游戏已经是几乎下到幼儿园上到养老院的居家旅行必备良品。因此,从技术层面来说,现在的网络游戏也面临着用户量激增、业务逻辑越来越复杂、需求频繁变化等种种问题。

所以,对于一款网游来说,拥有一套高承载、稳定性强、易扩展的服务端系统,是成功的最重要的先决条件之一。 注意,我说的之一,不然又要引起世纪大战。至于要把一款游戏做成功,什么最重要?我只能说重要的因素太多,技术、美术、策划、运营、管理者等,各自的重点关注点都不一样,没有谁更重要这一说,大家尽力把自己的工作做好,剩余的交给天意就好。有点扯远了,下面进入正题。

要满足高承载和易扩展,采用单服务器系统肯定是不现实的。靠谱的服务端系统,必须是分布式的。之后的描述,都是针对于长连接游戏。这里先给出基础架构图:

上图中1-n表示多个服务器,比如AgentService(1-n)表示多个AgentService。图中只包含服务端系统的基础必备节点,其他的什么充值服务、GM服务等等视具体业务需要的节点,这里就不一一列出了。下面依次对图中节点进行介绍。

一、GateService

网关服务,用来承载客户端连接。一般情况下,网关服务不处理任何业务逻辑,它接受了客户端的数据后,直接将其转发给具体的业务服务器即可。当然,数据加解密,消息序列号检测,这些与安全相关的逻辑建议放在网关服务,以减轻业务服务的压力,和业务开发的复杂度。

采用网关服务有什么好处?我主要总结了以下几点。

解决了单机资源有限,承载TCP连接的能力有限的问题。在运营过程中,我们可以根据实际的用户量来动态调整网关服务的数量。

将承载客户端连接的功能从业务服务器分离,减少业务服务的压力。同时客户端若有切换业务服务的操作时,也不用断开连接。

屏蔽了业务服务器与外网环境的接触,一定程度上增强了业务服务器的安全性。

从运营上来说,可节约成本。比如现在服务器,带宽都是很贵的,10个10M比1个100M便宜的多。多网关分担压力的同时也减轻了成本。

AgentService用于管理维护玩家当前所在的业务服务器,以及玩家所在逻辑服务器的切换。每一个玩家对应固定的AgentService。一般情况下,我们使用[HASH(用户唯一标识) % AgentService总数量]来确定用户所在的AgentService,这里用户唯一标识是具体情况,一般使用用户ID。无论是什么服务,都是通过AgentService定位用户。

比如网关服务,收到客户端数据之后,不用管玩家当前在在哪个业务服务,直接转发给该玩家对应的AgentService,再由AgentService转发给玩家当前所处逻辑服务。

当逻辑服务器要给用户推送消息,也直接转发给对应的AgentService,再由AgentService定位玩家所在的GateService,将消息推送过去。

当玩家A在逻辑服务1,玩家B在逻辑服务2。玩家A要给玩家B推送消息,此时逻辑服务1直接定位到玩家B所在的AgentService,将消息推送给该AgentService。

三、AddrService(HTTP)

地址管理服务,此为web服务,使用HTTP协议。 客户端通过此服务来获取网关地址。在多网关的情况下会考虑负载均衡,这里我们可以把负载均衡放在AddrService,一般我们使用简单的轮询即可。或者实在不放心的话,可以加入每一个网关当前负载值的记录,每次分配负载最轻的,分配后增加该GateService的负载值,另外再定时从每一个GateService获取实时的负载然后刷新本地记录即可。这样不是很精确,但是这里不用太过于精确。太过精确反而消耗资源,也不见得会使结果变得更好。

一般在实际中,包括客户端资源更新、客户端版本更新判断、打开游戏公告、分区分服等等相关功能,都放在AddrService中。

四、AuthService(HTTP)

用户鉴权服务,用于鉴定用户身份,此为web服务,使用HTTP协议。 现在的游戏的大部分都支持很多平台账号登录,比如QQ登录,微信登录等。而这些账号验证的功能一般与具体的游戏逻辑没有什么关系,所以我们可以将其独立处理,以WebService的方式实现即可。具体的不同渠道的用户验证的逻辑都在此WebService来做区分,然后以统一的方式来告知游戏服务器用户信息,以减轻游戏服务器的复杂度。

AuthService在验证账号通过以后,根据事先约定好的秘钥加上当前时间、账号信息等等来生成一个令牌(生成算法一般用MD5即可),将其返还给客户端。客户端只需将此令牌原样发送给业务服务,业务服务使用同样的秘钥验证,验证通过即为合法。

五、LoginService

专门处理用户登录、登录排队功能的服务,一个或多个,采用前面描述的定位AgentService的方式,来定位玩家对应的LoginService。 当某个客户端与服务端建立连接后,AgenService默认将玩家初始所在服务置为LoginService。刚刚建立连接后,客户端会发送登录消息。此消息被转发给LoginService,然后LoginService对其令牌进行合法性验证,验证合法后,完成用户登录。最后通知AgentService,将用户切换至具体的游戏服务器。

六、GameService

具体的游戏服务,处理具体的游戏相关逻辑,一个或者多个。一般我们根据具体的游戏业务来拆分游戏服务。 比如RPG游戏,我们可以将不同的地图,不同的场景拆分到不同的游戏服务。再如棋牌游戏,将不同的牌桌放在不同的游戏服务。另外,我们还可以分出机器人AI服务、聊天服务等等。

七、DBService

数据库服务,为业务服务和数据库之间的桥梁,一个或者多个。可以将数据缓存放在其中来提高查询效率。对于某些量级非常庞大的数据(如玩家角色数据),往往会采用多个节点来缓存。 因为数据缓存功能相对较为独立,一般都是长时间不重启的,在扩展节点的时候,我们也希望之前缓存的数据依然有效。所以定位DBService我们不再建议采用取余的方式,取余的方式在我们扩展DBService节点的时候,会使之前绝大部分的数据定位发生改变,从而造成大部分缓存数据失效,增大数据库的访问压力。这里我建议采用一致性hash的方式,我们在扩展节点时,只会使小部分数据定位受到影响,一定程度减小了数据库的缓存压力。当然也可以使用redis、memcache等来做数据缓存,这样的话DBService接只充当一个封装数据操作的作用,此时直接使用取余的方式来映射节点即可。对于一些量级不大的公共数据,往往只需要一个DBService节点就行了,这种映射关系直接放在配置文件中即可。

八、数据库

作为服务端,当然少不了数据库。为了能够有能力应对大量数据,当然不能使用单一的数据库。好在现在很多数据库都有自己的集群策略。如较为常用的关系数据库Mysql,或是非关系数据库mongodb都有集群策略。

在数据库的选择上,关系型数据库和非关系型数据库各有优势,比较两者的文章也很多,有兴趣的可以自己去搜索。就效率和稳定性而言,我只能说以上两者都是比较成熟的商用数据库,在效率和稳定性方面一般是不会出什么大问题的,都可以放心使用。

不过就我个人而言,我更倾向于非关系型数据库mongodb。第一因为mongodb的集群配置非常简单。第二是个人认为文档形的数据库更适合开发游戏。很多使用mysql的人可能有感触,为了满足不断变化的需求,一般在存储玩家数据上面都是直接将玩家数据对象序列化成二进制流,然后再放入在数据表。这样就不用随时修改数据库表了,但是弊端就是我们无法可视化查看数据,也无法单独修改某一项数据。如果使用非关系型数据库就不存在此问题,我们可以直接将对象存入数据库,也可单独修改一项,开发者也可以直接查看数据。

详解关于游戏服务端基础架构图相关推荐

  1. iSCSI详解及 iSCSI服务端配置、客户端(Linux、Windows配置)

    一.简介: iSCSI,Internet小型计算机系统接口,又称为IP-SAN,是一种基于因特网及SCSI-3协议下的存储技术,由IETF提出,并于2003年2月11日成为正式的标准.iscsi通过T ...

  2. SVN 版本服务器搭配全过程详解(含服务端、客户端)

    1.为什么要用VisualSVN Server,而不用Subversion? 回答: 因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Serve ...

  3. SVN版本服务器搭配全过程详解(含服务端、客户端)

    1.为什么要用VisualSVN Server,而不用Subversion? 回答: 因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Serve ...

  4. 【云风skynet】详解skynet的多核高并发编程丨actor模型丨游戏开发丨游戏服务端开发丨多线程丨Linux服务器开发丨后端开发

    skynet中多核高并发编程给我们的启发 1. 多核并发编程 2. actor模型详解 3. 手撕一个万人同时在线游戏 视频讲解如下,点击观看: [云风skynet]详解skynet的多核高并发编程丨 ...

  5. 游戏服务端开发之基础概念扫盲篇

    13年毕业后,做了一年多外包web开发,因为受不了在客户现场工作的氛围,愤然辞职.转行做了一名手游服务端开发. 在广州,据我所知,选择java作为服务端开发语言的公司大概有37互娱,百田,银汉,易娱, ...

  6. 百万在线:大型游戏服务端开发

    进入手游时代,服务端技术也在向前演进.现代游戏服务端既要承载数以万计的在线玩家,又要适应快速变化的市场需求,因此,如何设计合适的架构就成了重中之重.服务端技术并不简单,作为服务端新人,全面掌握服务端技 ...

  7. 新一代游戏服务端框架,该是什么样的?

    说起游戏服务端引擎,大家会想起Skynet.KbEngine.Photon.Pomelo等等.在探索服务端技术时候,我们不仅仅要了解当代服务端引擎,更要有些前沿眼光,去预测未来的游戏服务端是什么样的. ...

  8. web服务端和游戏服务端的区别

    最近几天在技术交流群里讨论到游戏服务端的一些技术细节,小说君发现有些做服务端的同学因为没有接触过游戏服务端,所以对游戏服务端产生了一些误解.因此今天的文章就从web服务端和游戏服务端的区别说起,简单介 ...

  9. 如何快速开发游戏服务端框架?

    快速开发游戏服务端框架的方法如下: 分析游戏需求:首先要明确游戏的功能和玩法,并确定服务端的职责. 选择适当的开发工具:可以选择一些专门用于游戏服务端开发的工具,比如 Unity.Unreal Eng ...

最新文章

  1. 基于互联网生态积累,百度Apollo智舱产品斩获智能网联创新奖
  2. Go微服务报错protoc-gen-go: unable to determine Go import path for
  3. Magicodes.IE Csv导入导出
  4. Deltix Round, Spring 2021 D. Love-Hate 随机化 + sos dp(高维前缀和)
  5. 东北师范大学计算机学院的导师,东北师范大学计算机科学与信息技术学院研究生导师简介-王佳男...
  6. 一个家庭女人太强势,这个家庭会怎样?
  7. 新零售时代,美妆行业如何打造新主场?
  8. 佳能80d有人脸识别吗_2020单反/微单相机推荐,单反和微单(无反)选购攻略,佳能、尼康、索尼、富士、松下相机...
  9. 使用HTML5构建iOS原生APP(2)
  10. python 更新pip报错 解决方法大全
  11. 留言列表模板HTML代码
  12. 李飞飞、吴恩达、Bengio等人的15大顶级深度学习课程(转)
  13. Android 6.0 运行时权限管理最佳实践
  14. SVN问号图标清除方法
  15. MATLAB使用符号工具箱计算函数的5阶麦克劳林多项式的四种方法(附指定阶数、指定点的泰勒展开)
  16. 百度在北京和深圳主攻腾讯 新浪等一些IM公司,大力挖人,甚至爆出15w-20w年薪,有人士对百度的行为做出以下分析:
  17. jQuery(一):概述、选择器、操作(元素本身、属性、内容、样式)、元素遍历、事件
  18. 同时采集抖音里多个视频,并批量添加相同的背景图片
  19. 洗牌前夜:中国云主机市场全景观察
  20. pdf怎么分割成多个文件?有两种方式

热门文章

  1. iOS新特性框架、仿微信图片浏览、视频监控、爱心动画、文字适配等源码
  2. 减少在线去重造成的数据碎片
  3. PCB电路板元件目标检测数据集(YOLO标签,1400张,9类目标)
  4. Android+6.0的全盘加密(,Android6.0强制全盘加密 隐私牺牲性能
  5. XSS(Cross-site Script,跨站脚本)漏洞笔记
  6. 计算机初级操作员试题汇编,计算机初级操作员试卷.doc
  7. 关于void (visit)(const ElemType )的理解
  8. js数组查找最接近_js 2种方法从数组里面找到最接近某个数值的值(小于该指定值,并且大于其他值)...
  9. 关于stm32 HAL 库的一点小总结
  10. asp.net mvc + javascript生成下载文件