一种高性能网络游戏服务器架构设计

网络游戏的结构分为客户端与服务器端,客户端采用2D绘制引擎或者3D绘制引擎绘制游戏世界的实时画面,服务器端则负责响应所有客户端的连接请求和游戏逻辑处理,并控制所有客户端的游戏画面绘制。客户端与服务器通过网络数据包交互完成每一步游戏逻辑,由于游戏逻辑是由服务器负责处理的,要保证面对海量用户登录时,游戏具有良好的流畅性和用户体验,优秀的服务器架构起到了关键的作用。

1  服务器架构设计

1.1  服务器架构分类 
服务器组的架构一般分为两种:第一种是带网关服务器的服务器架构;第二种是不带网关服务器的服务器架构,这两种方案各有利弊。在给出服务器架构设计之前,先对这两种设计方案进行详细的探讨。所谓网关服务器,其实是Gate服务器,比如LoginGate、GameGate等。网关服务器的主要职责是将客户端和游戏服务器隔离,客户端程序直接与这些网关服务器通信,并不需要知道具体的游戏服务器内部架构,包括它们的IP、端口、网络通信模型(完成端口或Epoll)等。客户端只与网关服务器相连,通过网关服务器转发数据包间接地与游戏服务器交互。同样地,游戏服务器也不直接和客户端通信,发给客户端的协议都通过网关服务器进行转发。

1.2  服务器架构设计 
根据网络游戏的规模和设计的不同,每组服务器中服务器种类和数量是不尽相同的。本文设计出的带网关服务器的服务器组架构如图1所示。


本文将服务器设计成带网关服务器的架构,虽然加大了服务器的设计复杂度,但却带来了以下几点好处:
(1)作为网络通信的中转站,负责维护将内网和外网隔离开,使外部无法直接访问内部服务器,保障内网服务器的安全,一定程度上较少外挂的攻击。 
(2)网关服务器负责解析数据包、加解密、超时处理和一定逻辑处理,这样可以提前过滤掉错误包和非法数据包。
(3)客户端程序只需建立与网关服务器的连接即可进入游戏,无需与其它游戏服务器同时建立多条连接,节省了客户端和服务器程序的网络资源开销。 
(4)在玩家跳服务器时,比如大场景切换,不需要断开与网关服务器的连接,玩家数据在不同游戏服务器间的切换是内网切换,切换工作瞬间完成,玩家几乎察觉不到,这保证了游戏的流畅性和良好的用户体验。 
在享受网关服务器带来上述好处的同时,还需注意以下可能导致负面效果的两个情况:如何避免网关服务器成为高负载情况下的通讯瓶颈问题以及由于网关的单节点故障导致整组服务器无法对外提供服务的问题。上述两个问题可以采用“多网关” 技术加以解决。顾名思义,“多网关” 就是同时存在多个网关服务器,比如一组服务器可以配置三台GameGate。当负载较大时,可以通过增加网关服务器来增加网关的总体通讯流量,当一台网关服务器宕机时,它只会影响连接到本服务器的客户端,其它客户端不会受到任何影响。 
从图1的服务器架构图可以看出,一组服务器包括LoginGate、LoginServer、GameGate、GameServer、DBServer和MServer等多种服务器。LoginGate和GameGate就是网关服务器,一般一组服务器会配置3台GameGate,因为稳定性对于网络游戏运营来说是至关重要的,而服务器宕机等突发事件是游戏运营中所面临的潜在风险,配置多台服务器可以有效地降低单个服务器宕机带来的风险。另外,配置多台网关服务器也是进行负载均衡的有效手段之一。下面将对各种服务器的主要功能和彼此之间的数据交互做详细解释。
(1)LoginGate 
LoginGate主要负责在玩家登录时维护客户端与LoginServer之间的网络连接与通讯,对LoginServer和客户端的通信数据进行加解密、校验。
(2)LoginServer 
LoginServer主要功能是验证玩家的账号是否合法,只有通过验证的账号才能登录游戏。这样可以过滤掉一部分不合法的帐号,或者一些恶意登陆信息。从架构图可以看出, DBServer和GameServer会连接LoginServer。玩家登录基本流程是,客户端发送账号和密码到LoginServer验证,如果验证通过,LoginServer会给玩家分配一个SessionKey,LoginServer会把这个SessionKey发送给客户端、DBServer和GameServer,在后续的选择角色以后进入游戏过程中,DBServer和GameServer将验证SessionKey合法性,这里是内网验证,GMServer从DBserver中取出SessionKey,与客户端带来的Sessionkey进行对比,如果和客户端携带的SessionKey不一致,将无法成功获取到角色或者进入游戏。
(3)GameGate 
GameGate(GG)主要负责在用户游戏过程中负责维持GS与客户端之间的网络连接和通讯,对GS和客户端的通信数据进行加解密和校验,对客户端发往GS的用户数据进行解析,过滤错误包,对客户端发来的一些协议作简单的逻辑处理,其中包括游戏逻辑中的一些超时判断。在用户选择角色过程中负责维持DBServer与客户端之间的网络连接和通讯,对DBServer和客户端的通信数据进行加解密和校验,对客户端发往DBServer的用户数据做简单的分析。维持客户端与MServer之间的网络连接与通讯、加解密、数据转发和简单的逻辑处理等。
(4)GameServer 
GameServer(GS)主要负责游戏逻辑处理。网络游戏有庞大世界观背景,绚丽激烈的阵营对抗以及完备的装备和技能体系。目前,网络游戏主要包括任务系统、声望系统、玩家PK、宠物系统、摆摊系统、行会系统、排名系统、副本系统、生产系统和宝石系统等。从软件架构角度来看,这些系统可以看着GS的子系统或模块,它们共同处理整个游戏世界逻辑的运算。游戏逻辑包括角色进入与退出游戏、跳GS以及各种逻辑动作(比如行走、跑动、说话和攻击等)。 
由于整个游戏世界有许多游戏场景,在该架构中一组服务器有3台GS共同负责游戏逻辑处理,每台游戏服务器负责一部分地图的处理,这样不仅降低了单台服务器的负载,而且降低了GS宕机带来的风险。玩家角色信息里会保持玩家上次退出游戏时的地图编号和所在GS编号,这样玩家再次登录时,会进入到上次退出时的GS。 
上面提到过,在验证账号之后,LoginServer会把这个SessionKey 发给GS,当玩家选择角色登录GS时,会把SessionKey一起发给GS,这时GS会验证SessionKey是否与其保存的相一致,不一致的话GS会拒绝玩家进入游戏。MServer的主要负责GS之间的数据转发以及数据广播,另外,一些系统也可以放到MServer上,这样也可以减轻GS的运算压力。
(5)DBServer 
DBServer主要的功能是缓存玩家角色数据,保证角色数据能快速的读取和保存。由于角色数据量是比较大的,包括玩家的等级、经验、生命值、魔法值、装备、技能、好友、公会等。如果每次GS获取角色数据都去读数据库,效率必然非常低下,用DBServer缓存角色数据之后,极大地提高了数据请求的响应速度。
LoginServer会在玩家选组时把SessionKey发给DBServer,当玩家发送获取角色信息协议时会带上这个SessionKey,如果跟DBServer保存的SessionKey不一致,则DBServer会认为玩家不是合法用户,获取角色协议将会失败。另外,玩家选取角色正式进入游戏时,GS会给DBServer发送携带SessionKey的获取角色信息协议,这时DBServer同样会验证SessionKey的合法性。总之,只有客户端、DBServer和GS所保存的SessionKey一致,才能保证协议收到成功反馈。 
与DBServer通讯的服务器主要有GG,GS和LoginServer,DBServer与GG交互的协议主要包括列角色、创建角色、删除角色、恢复角色等,DBServer与GS交互的协议包括读取角色数据、保存角色数据和跳服务器等,DBServer与LoginServer交互的协议主要是用户登录协议,这时候会给DBServer发送SessionKey。 
(6)MServer 
每一个组有一台MServer,主要负责维持3台GS之间数据的转发和数据广播。另外一些游戏系统也可能会放到MServer上处理,比如行会系统。 
1.3  服务器交互的主要流程 
下面给出服务器之间数据通讯的主要流程从这些流程能看出各种服务器之间是如何数据交互和协同工作的。


图2的流程说明了,在选角色过程中,客户端会把携带游戏账号和SessionKey的选角色协议发给GG,GG做一些简单处理之后转发给DBServer,DBServer要验证SessionKey的合法性,验证通过之后,DBServer会从角色信息缓冲区里取出该账户的所有角色信息发给客户端。这个过程在客户端的表现是,当选择好服务器组之后,客户端会直接显示该账号下的所有角色,之后就可以选择角色进入游戏了。


图3的流程说明了,在玩家选角色正式进入游戏时,客户端会把携带游戏账号、角色ID和SessionKey的登录协议发给GG,GG做一些简单处理之后转发给GS。GS会验证SessionKey的合法性,验证通过之后,GS会把验证通过的结果发给客户端,同时GS给DBServer发获取角色数据的协议,这些角色数据是一个玩家所有的游戏数据,包括装备、技能等等。


图4的流程说明了,在玩家游戏过程,客户端把逻辑协议(包括走、说话、跑、使用技能等)发给GG,GG完成加解密和简单逻辑处理之后转发给GS,GS负责这些协议的主要逻辑处理。

总结:这只是一种简单的构架,真实的游戏开发过程中,要比这复杂的多,但这个架构具有总体性,目前的游戏服务器架构都是在此基础上进行的一些扩展。比如还可以增加单独的AI服务器,聊天服务器,战斗服务器,跨服战服务器等等。这些服务器之间的组织,通信方式都可以参考这个方案。

如转载,请注明来自:游戏技术网

原文:http://www.youxijishu.com/blogs/31.html

时间: 2024-10-05 08:14:13

一种高性能网络游戏服务器架构设计的相关文章

Unity3D游戏开发之网络游戏服务器架构设计培训(如何做一名好主程)

在我们初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发.后面就应该朝着主程的方面前进 今天给大家讲一下如何做一个好的主程 入手 假如,我现在接手一个新项目,我的身份还是主程序.在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问题: 1.服务器跑在什么样的操作系统环境下?2.采用哪几种语言开发?主要是什么?3.服务器和客户端以什么样的接口通讯?4.采用哪些第三方的类库? 除了技术背

Unity3D游戏开发之网络游戏服务器架构设计培训

下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天给大家讲一下如何做一个好的主程 入手 假如,我现在接手一个新项目,我的身份还是主程序.在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问题: 1.服务器跑在什么样的操作系统环境下?2.采用哪几种语言开发?主要是什么?3.服

高性能后台服务器架构设计

ref:https://www.cnblogs.com/lidabo/p/6627642.html 如何设计高性能的大型网站系统?在移动互联网时代,客户端应用开发本身,并不是体验的决胜之处,真正对团队挑战的地方,还在于后端,无论是承压能力,还是安全性等方面,如果这些地方过不了关,整个应用的基础是不扎实的. 提高服务器性能最简单粗暴的方式,就是增加机器和升级硬件配置.虽然现在的硬件越来越便宜,但是一味地通过增加机器来解决并发量的增长,成本是非常高昂的.结合技术优化方案,才是更有效的解决方法. 一.

当前一种先进实用的架构设计

目录 1系统架构图...1 2架构设计...3 2.1项目开发环境...3 2.2运行环境要求:...3 2.3 服务器架构平台:...4 2.4.架构逻辑设计...5 2.4.1 LVS+KEEPLIVED+SQUID+HAPROXY+JBOSS集群...5 2.4.2mysql集群...6 2.4.3fastdfs图片服务器集群...8 2.4.4acveMQ服务器集群...8 3 架构剖析...10 3.1负载均衡器解析...10 3.2 lvs解析...11 3.3keeplived解析

高性能高并发服务器架构设计探究—以flamigo服务器代码为例

这篇文章我们将介绍服务器的开发,并从多个方面探究如何开发一款高性能高并发的服务器程序.所谓高性能就是服务器能流畅地处理各个客户端的连接并尽量低延迟地应答客户端的请求:所谓高并发,指的是服务器可以同时支持多的客户端连接,且这些客户端在连接期间内会不断与服务器有数据来往.这篇文章将从两个方面来介绍,一个是服务器的框架,即单个服务器程序的代码组织结构:另外一个是一组服务程序的如何组织与交互,即架构.注意:本文以下内容中的客户端是相对概念,指的是连接到当前讨论的服务程序的终端,所以这里的客户端既可能是我

[转]一种经典的网络游戏服务器架构

转自: http://www.cppblog.com/johndragon/archive/2008/04/10/46768.html 出于学习目的转载,如果有不妥当或者侵权的话请及时联系~ 这个图是一个区的架构图,所有区的架构是一样的.上面虚线框的ServerGroup和旁边方框内的架构一样.图上的所有x N的服务器,都是多台一起的.红线,绿线,和蓝线图上也有图示,这里就不多介绍了.关于Agent Server大家也能看出来,其实就是Gate. 这里主要介绍下图上的标记了号码的位置的数据连接的

棋牌游戏服务器架构设计

转载自:简书一位同行的文章 一,棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间中的人可以接收到其他人的消息. 3,每个房间的操作必须是顺序性 这个特性类似与一般游戏的回合制,每个玩家的操作都是有顺序性的. 二,需要解决的技术点 1,数据共享 因为棋牌类游戏不分区不分服,我们在设计服务器的时候,是按世界服的思想去设计,即服务器是一个n多台物理机的集群

移动端网络游戏服务器架构

移动端网络游戏主要分为两种类型,一种是弱联网的,一种是强联网的. 弱联网的游戏,主要是指对游戏数据实时性要求比较低的联网游戏,比如卡牌游戏,休闲游戏等. 强联网的游戏,主要是指对游戏数据实时性要求比较高的联网游戏,比如MMORPG,ARPG等. 要求客户端与服务器之间进行实时通信. 在这里主要是跟大家讨论一下如何架设具有负载均衡的游戏服务器,对于游戏服务器开发,自然而然就会涉及到分区,跨服,并服等需求,针对这些需求我们该如何去架设服务器? 以下是我们服务器架设示意图,供大家参考: 首先我们先绘制

简论游戏服务器架构设计

一.QIPAI类服务器的特点 1,QIPAI类不分区不分服 一般来说,QIPAI游戏都是不分区不分服的.所以QIPAI类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间中的人可以接收到其他人的消息. 3,每个房间的操作必须是顺序性 这个特性类似与一般游戏的回合制,每个玩家的操作都是有顺序性的. 二,需要解决的技术点 1,数据共享 因为QIPAI类游戏不分区不分服,我们在设计服务器的时候,是按世界服的思想去设计,即服务器是一个n多台物理机的集