Framework - ScutGame/Scut GitHub Wiki

服务器框架层次结构

主要包括:通讯协议层,Action动作层,中间件层,数据缓存层,数据实体层,数据持久层。 层次结构

层次关系如下:

  • 通讯协议层

服务器支持同时提供Http、WebSocket和Socket两种通讯接入方式;使用二进制的通讯协议,通过“协议生成器”工具设计客户端与服务器的通讯协议Action接口,它将生成客户端与服务器两端的接口通讯代码,减少通讯协议联调时间;另外也支持自定义的通讯协议,需要实现IActionDispatcher接口。

  • Action动作层

它属于业务逻辑层模块,需要开发者实现,你可以选择喜欢的(C#、Python和Lua)脚本语言开发,需要为每种请求行为设计相应的Action响应数据,客户端获得数据有两种方式,一种由客户端主动请求获得响应数据,或者由服务器主动推送相应的Action响应数据。

Action层使用脚本的优先级为:Python脚本 -> Lua脚本 -> C#脚本

  • 中间件层

提供的游戏模块中间件可以方便快速构建应用,特别对繁琐的渠道登录和充值的SDK模块接入进入封装,简单的配置即可完成接入,参考《中间件使用文档》。

  • 数据缓存层

缓存的基本元素是数据实体对象,分为ShareEntity、BaseEntity和LogEntity子类。

缓存的类型分为共享全局的和私有的两种,共享的缓存如果在内存中不存在时,它会从数据库中加载所有的数据到内存中;而私有类型的只会根据相应的Key加载部分数据到内存中;因此玩家特有的数据(如:背包,任务,副本)定义成私有的,像排行榜类型的定义成共享的。

为了提高服务器的响应速度,我们会将需要处理的实体数据放到缓存中,减少从数据库取数据的次数,同时缓存中的实体数据被改变后,引擎以异步的方式(100ms延迟时间)将实现数据同步到Redis库中,如果有在实体中配置数据库同步,则间隔一定时间(默认5分钟)同步;当缓存中的数据在24小时内(可配置)未被使用时,缓存将会过期,引擎会自动将过期的缓存回收,降低内存使用。

  • 数据实体层

数据实体是缓存存储的基本元素,通过对它进行序列化方式持久化存储(目前只支持C#脚本定义,实体类中不能有业务逻辑处理),并且定义有数据库表结构信息,通过表结构信息可以自动创建表、列,也及生成更新sql语句等功能,开发人员不必关注数据库结构设计,需要定义自己的数据实体类及属性(类名对应数据库的表名,属性对应字段)。

  • 数据持久层

游戏数据持久化是最重要、最复杂、也是最容易出错的部分,框架封装了对数据库数据的读取、更新、删除和表的创建维护等管理;我们支持Redis、MSSQL、Mysql等多种数据库的方式持久化。

服务器架构

包括:用户中心服务器,分服中心服务器,游戏私服服务器,Redis服务器,数据库服务器。

架构

服务器的拓扑结构图:

  • 用户中心服务器

用户中心负责用户注册,登录验证等服务。

  • 分服中心服务器

分服中心管理多个游戏私服的状态、名称、通讯地址等信息,提供获取私服列表及私服状态查询服务。

  • 游戏私服服务器

游戏私服提供具体的游戏业务逻辑服务,支持同时多人在线;一个私服对应一个Redis服务顺和一个数据库服务器。

  • Redis服务器

Redis服务器主要负责存储玩家游戏数据信息,游戏私服重启后玩家的数据不会丢失。

  • 数据库服务器

数据库提供游戏配置数据信息,玩家操作日志信息,或者提供报表分析数据。

稳定与性能

  • 程序稳定

游戏服超过1000小时无须进行任何维护;数据自动同步,减少因开发者技能问题造成数据丢失。

  • 内存占用

玩家不在线,在指定时间(24H)内将数据从Cache中移除,释放内存使用。

  • CPU占用

虚拟服务器CPU 4核,内存8G的环境上,负载测试TPS达到1213/s,平均响应6.8ms,服务器CPU占用范围20-50%;在服务器实体器上TPS还有提升;单服在线人数支撑30000-50000没有问题。

详情见:负载测试报告