游戏服务器设计
2014-10-25 12:01 youxin 阅读(2177) 评论(1) 编辑 收藏 举报游戏服务器系统设计
1.1 服务器架构分类
服务器组的架构一般分为两种:第一种是带网关服务器的服务器架构;第二种是不带网关服务器的服务器架构,这两种方案各有利弊。在给出服务器架构设计之前,先对这两种设计方案进行详细的探讨。所谓网关服务器,其实是Gate 服务器,比如LoginGate、GameGate 等。网关服务器的主要职责是将客户端和游戏服务器隔离,客户端程序直接与这些网关服务器通信,并不需要知道具体的游戏服务器内部架构,包括它们的IP、端口、网络通信模型(完成端口或Epoll)等。客户端只与网关服务器相连,通过网关服务器转发数据包间接地与游戏服务器交互。同样地,游戏服务器也不直接和客户端通信,发给客户端的协议都通过网关服务器进行转发。
1.2 服务器架构设计
根据网络游戏的规模和设计的不同,每组服务器中服务器种类和数量是不尽相同的。本系统设计出的带网关服务器的服务器组架构如图1 所示。
图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 合法性,如果和客户端携带的SessionKey 不一致,将无法成功获取到角色或者进入游戏。
(3)GameGate
GameGate(GG)主要负责在用户游戏过程中负责维持GS与客户端之间的网络连接和通讯,对GS 和客户端的通信数据进行加解密和校验,对客户端发往GS 的用户数据进行解析,过滤错误包,对客户端发来的一些协议作简单的逻辑处理,其中包括游戏逻辑中的一些超时判断。在用户选择角色过程中负责维持DBServer 与客户端之间的网络连接和通讯,对DBServer 和客户端的通信数据进行加解密和校验,对客户端发往DBServer 的用户数据做简单的分析。维持客户端与MServer 之间的网络连接与通讯、加解密、数据转发和简单的逻辑处理等。
(4)GameServer
GameServer(GS)主要负责游戏逻辑处理。在软件架构层面,本系统将游戏的众多系统设计成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 选择角色信息流程
图2 的流程说明了,在选角色过程中,客户端会把携带游戏账号和SessionKey 的选角色协议发给GG,GG 做一些简单处理之后转发给DBServer,DBServer 要验证SessionKey的合法性,验证通过之后,DBServer 会从角色信息缓冲区里取出该账户的所有角色信息发给客户端。这个过程在客户端的表现是,当选择好服务器组之后,客户端会直接显示该账号下的所有角色,之后就可以选择角色进入游戏了。
图3 玩家进入游戏流程
图3 的流程说明了,在玩家选角色正式进入游戏时,客户端会把携带游戏账号、角色ID 和SessionKey 的登录协议发给GG,GG 做一些简单处理之后转发给GS。GS 会验证SessionKey 的合法性,验证通过之后,GS 会把验证通过的结果发给客户端,同时GS 给DBServer 发获取角色数据的协议,这些角色数据是一个玩家所有的游戏数据,包括装备、技能等等。
图4 游戏逻辑数据转发流程
图4 的流程说明了,在玩家游戏过程,客户端把逻辑协议(包括走、说话、跑、使用技能等)发给GG,GG 完成加解密和简单逻辑处理之后转发给GS,GS 负责这些协议的主要逻辑处理。