多人在线仿真训练系统的服务端设计与实现

2021-04-08 05:52
关键词:服务端网关客户端

张 漫 刘 俊 赵 娅

(东北石油大学 计算机与信息技术学院, 黑龙江 大庆 163318)

随着虚拟现实技术、三维仿真技术以及计算机图形学的不断发展,仿真训练系统也在向多用户、多终端、三维训练和在线训练的方式发展,使训练系统转变为客户端-服务端结构。在客户端-服务端结构下,服务端和客户端之间需要通过协议进行数据通信,即用户在客户端进行训练操作,客户端对接收到的信息进行处理、压缩后转发给服务器,服务器处理后再将结果反馈给客户端。目前,这种结构主要用于网络游戏开发。

根据服务器和客户端之间的数据通信方式来划分,常见的网络游戏可分为点对点客户端和服务器模式、基于分组的网络模式和纯CS结构网络模式[1]。

点对点客户端和服务器模式支持局域网操作,将一台计算机作为主机服务器,其他计算机作为客户端与之连接。其核心逻辑算法是在每个客户端独立运行,不依赖服务器处理。

基于大厅的在线游戏,最早出现在聊天系统中。大厅模块服务于一个处理独立事务的服务器,其功能主要是匹配来自不同地区和网段的客户端用户,使这些用户能够处于同一个世界中,在同一个世界中操作。在这种网络模式下,数据库通常需要对用户的操作进行评分并分别进行存储,以便保存他们的分数;服务器通常不负责核心结构运算处理,它更像是一个辅助工具,与游戏系统分割开来,只为用户提供一个可供选择的服务器房间。每个客户端彼此平等,整体性能和速度大致相等,既是客户端又是服务器。

在网络游戏服务端架构的基础上,我们设计了适用于三维虚拟仿真训练系统的服务端系统,可以增强仿真训练系统的性能。

1 服务端的设计与实现

1.1 设计原则

为了更好地适应用户需求,坚持以下设计原则:

(1) 系统严格分为服务端和客户端,两者的开发是相互分离、同时进行。用户能够接触的只有客户端,服务端的维护由系统开发者负责。

(2) 服务端负责系统的核心逻辑操作和信息处理,包括用户账户信息、角色信息、成绩信息以及匹配机制等。客户端只负责向用户呈现界面及场景内容等不关键的逻辑,并能够随时保持与服务器的连接。

(3) 系统整体上要具备良好的运行效率与扩展性,服务端应实时处理客户端对于账号数据的静态全局性请求和动态非全局性请求。

1.2 服务端模块架构

仿真训练服务器由PHP服务器和C++服务器组成。鉴于三维模拟在线训练对系统性能有严格的要求,使用C++服务器来处理实际训练场景中的运算逻辑和关键数据信息,使用PHP服务器(登录服务器)来处理注册和登录等功能需求。服务端采用epoll机制来处理来自客户端的连接,以提高查询和处理客户端连接的效率。

服务端设计架构如图1所示。负载层,在CDN服务器和Ngnix服务器的配合下实现负载均衡,提升网络数据处理能力。应用层,主要实现数据编码与解码、数据同步传输、数据压缩与解压等功能。中心服务器负责监听来自客户端或者系统服务端发送的协议、数据流和信息流,然后执行相关处理。为了充分利用服务端资源,并保障内部核心数据的安全,将整体的服务分为多个层次,包括登录服务器、网关服务器、日志服务器、中心(大厅)服务器和仿真服务器等。登录服务器为整个服务体系的入口服务器,负责整个系统中用户账户的管理工作。网关服务器承担服务器信息的中转和检测工作。中心服务器为整个仿真功能的控制中心,在用户进入系统的仿真训练大厅时,提供对应的训练队伍通信、仿真任务查询,并控制相关仿真环境的编辑及训练服务的提供。日志服务器负责后台的统计服务,主要存储培训的总次数、合格次数和训练成绩等。仿真服务器提供训练环境、任务环境、仿真体、训练任务和训练信息的演算功能。

服务器系统通过部署多个节点实现集群化,然后通过自动故障转移和自动切换流量而保证系统的高可用性。使用反向代理集群,解决客户端到反向代理层的高可用问题。通过主从同步的缓存,解决服务层到缓存层的高可用问题。最后在数据库层采用“主从同步,读写分离”架构,实现服务层到数据层的高可用问题。设计过程中,将所有资源池化,实现资源的高可用性。通过软件定义存储,将所有硬盘统一建立存储池,实现文件的分布式存储。即使有某一节点损坏了,也不影响数据的完整性。另外使用软件定义资源,支持高扩展,可以任意增加或替换现有资源。各服务器节点之间采用消息队列进行通信,不需要专用连接。

图1 服务端架构

1.3 服务器模块设计

把整体的服务划分之后,缓解了服务器的逻辑处理能力和负载,但频繁的场景切换仍容易扰乱中间连接状态,使培训系统的管理和维护变得艰难,并产生不必要的开销。因此,单独划分出一个网关服务器[3]。一些公用的处理逻辑包括系统的登录、排行榜查询等模块,在网关服务器内部进行预处理,然后将信息转发。对于其他特殊逻辑则直接进行转发[4],移交给对应的服务器进行处理。服务端系统模块架构如图2所示。

这种划分方法可减少系统服务器的访问压力,但多台服务器可同时访问数据库,则会增加数据库的压力。因此,在服务端使用前端代理来进行缓存处理。服务器不直接访问数据库,而是去访问代理服务器,最后由代理服务器访问底层数据库。

系统中的PHP模块需要满足大流量且稳定运行的情况,因此使用了Ngnix反向代理技术来实现负载均衡。为了避免因信息不同步而导致重复登录问题,系统将所有会话信息放入Redis缓存之中,Ngnix分配的任何节点都可以从Redis获取用户信息,从而实现会话共享[5]。

图2 服务端系统模块架构

1.3.1 登录服务器

登录服务器是用来管理用户登录的逻辑功能服务器,它兼负对用户数据和服务之间的校验功能,完成从用户客户端到服务器、Redis缓存、数据库之间的信息交互,为用户进入系统中的网关服务器发送Token。登录服务器的模块架构如图3所示。其中,网络通信组件模块为各大服务提供网络通信功能;Protobuf模块提供对应的数据读取及网络协议的序列化和反序列化功能;数据库交互模块提供MySQL数据库的连接、存储、查询和读取等功能;通信和逻辑处理模块负责仿真训练逻辑的处理及通信。

图3 登录服务器模块架构

在用户端发起登录请求后,服务器端根据加载的数据验证客户端的Token,网关服务器返回登录连接信息。客户端收到鉴权信息、完成登录以后,再向网关服务器发起连接和鉴权信息。具体的时序流程如图4所示。

图4 登录时序

1.3.2 网关服务器

网关服务器模块主要负责信息和用户身份的鉴权,并在各个服务之间转发数据信息。它的主要功能包括:监听来自客户端的各种消息;与客户端进行连接,建立和客户端之间的会话层,接收客户端和Post服务器到客户端之间的消息;与部分服务器建立起会话层的相关连接,转发服务器之间的数据消息;作为各个服务器数据信息的中转机构,对信息进行鉴权验证并去除不合法的信息。其模块架构如图5所示,其中的网络通信组件模块和Protobuf模块与登录服务器的设计相同,但网关服务器不需要与数据库进行交互;网络逻辑管理模块负责实现对应的验证和转发协议,并监听来自各个服务器的协议通信[6]。

1.3.3 中心服务器

中心服务器主要接收来自用户的数据信息,根据用户的数据信息和客户端的连接形成中心的会话交流池。在训练开启中它不直接与仿真服务器进行交互,而是通过网关服务器与其他服务进行通信。其模块架构如图6所示。

在仿真训练系统中,中心服务器的功能服务包括以下几个方面:

(1) 教导员配置任务信息。如果使用教导员账号登录并授权,会首先进入客户端配置页面。配置完成以后,将相关配置信息发送给服务器,服务器根据配置信息和data信息在中心服务器内存中生成任务。

图5 网关服务器模块架构

图6 中心服务器模块架构

(2) 用户授权进入任务。任务配置完成以后,在任务中心的用户会收到授权,再发送授权给中心服务器,随即进入任务大厅。

(3) 任务中心聊天。进入任务大厅的所有人可以进行实时聊天。

(4) 任务信息查询和用户信息查询。在大厅里面,可以查询当前任务和当前任务里所有用户的信息,包括以往任务的历史记录。

(5) 教学任务视频流。在大厅中的用户,可以通过大厅的开放权限查看和任务相关的教学视频,了解任务要点。

(6) 开辟训练场。任务大厅里的所有用户准备完毕后,中心服务器会开辟分布式服务,为对应这次任务的用户和教员提供仿真训练服务。作为中心服务器,它可以同时提供多个训练仿真服务,在不同的教室可同时进行仿真教学。

1.3.4 仿真服务器

仿真服务器是一个独立的逻辑服务运算单位架构,为整个仿真体系在训练数据运算、人物信息同步和训练AI等方面提供逻辑运算服务。其模块架构如图7所示。

图7 仿真服务器模块架构

仿真服务器的主要功能如下:

(1) 仿真任务模拟计算生成。上传人物配置数据并将信息显示给用户,生成对应的训练数据,计算仿真基础数据。

(2) 仿真人员信息加入训练场景。验证在训练开启时加入教员和用户的仿真人物,实现训练中用户信息的注册和仿真人物的生成。

(3) 任务信息统计和训练计时。统计参与人员的得分及相关仿真训练任务计时,将其作为评估仿真任务完成情况的依据。

(4) 任务事件处理和仿真信息统计演算。在对应的仿真环境中添加心跳监听,接收仿真训练中发生的事件,统计用户产生的事件,将其作为最终评分的依据。

(5) AI仿真辅助。在客户端设有对应的辅助AI,但它的行为控制不能在客户端进行计算。因此,针对AI的不同状态,在仿真服务器中建立对应的AI状态控制管理模块,来同步AI的智能状态情况。

(6) 工具、仿真人员、训练事件等信息仿真同步。同步训练环境中的动态物体情况。

(7) 同步仿真中的实时聊天信息。

(8) 网络连接。用户通过连接网关服务器进行协议的转发。

2 后台信息管理系统架构设计与实现

后台信息管理系统用于仿真训练的信息管理,其中包括权限管理、数据库备份、服务器管理、文件管理。

按MVC思想将后台信息管理系统进行拆分,分为模型层(Model)、视图层(View)和控制器层(Controller)。这种拆分的优点是将模型(业务逻辑)和视图(表示层)分离,对模型和视图可以独立修改,而不会相互影响。一个模型可以控制多个视图层,并且这部分代码可以重用,因此降低了代码的重复性[8]。控制器层充当模型层和视图层之间的媒介。

后台信息管理系统的功能模块,包括账号管理、用户管理、服务器配置、训练数据管理、运营管理、管理员和公告管理。账号管理模块主要用来展示账号的基本信息和登录日志等内容,监控用户的每日在线情况,监控每日的注册详情和对每日注册人数进行限制和管理。用户管理模块用于查询和展示角色的基本信息、操作日志等。服务器配置模块主要是对服务器进行部署、编辑以及后期扩展。训练数据管理模块是用来统计用户的训练完成情况及合格次数等。运营管理模块主要是对数据库的操作进行控制管理;管理员模块负责对后台管理员的权限编辑及资料管理。公告管理模块负责滚屏公告和登录公告的查询、申请等。

后台信息管理系统使用Nginx作为Web服务器。为了提升用户页面的加载速度,使用gzip技术对页面进行压缩,并且使用DNS轮询方式进行负载均衡处理。

3 测试情况

在多台Linux机器上部署服务,即使一台机器出现问题,其他机器依然可以提供服务。主服务器负责提供服务,从服务器负责监听主服务器的心跳。如果主服务器出现问题,则立刻转换为从服务器提供服务。使用的Linux版本为CentOS,服务器启动界面如图8所示。

图8 服务器界面

当有用户进入系统时,服务器会有相应的信息显示。用户传输相应的协议时,服务器会显示对应的协议名称。测试结果显示:服务器延迟时间小于50 ms,数据交互速度大于1 000 Bytes,丢包率小于5%。这表明基于网络游戏服务端架构设计的服务端系统具有良好的性能,能够适用于大型多人在线三维仿真训练系统。

猜你喜欢
服务端网关客户端
你的手机安装了多少个客户端
“人民网+客户端”推出数据新闻
——稳就业、惠民生,“数”读十年成绩单
智能燃气表物联网运行体系网关技术研究
基于FPGA的工业TSN融合网关设计
大规模低轨卫星网络移动性管理方案
一种主从冗余网关的故障模式分析与处理
多人联机对战游戏的设计与实现
基于三层结构下机房管理系统的实现分析
基于三层结构下机房管理系统的实现分析
媒体客户端的发展策略与推广模式