分布式游戏服务器设计

2023-05-16

分布式游戏服务器设计

  • 服务器解释
  • 整体设计图
  • 网关服务器
    • 网络连接
    • 消息处理
    • 权限管理
    • 业务支持
    • 消息路由
  • 登录服务器
    • 网络连接
    • 用户注册
    • 用户登录
  • 中心服务器
    • 用户管理
    • 消息推送
    • 全局功能
  • 游戏服务器
    • 数据读取
    • 数据落地
    • 消息处理
  • 存储服务器
    • 工作模式
    • 数据一致性
  • 依赖系统
    • 服务发现
    • 消息队列
    • 存储系统

服务器解释

  • 网关服务器 Gateway Server,与客户端保持长连接并转发消息给中心服务器和游戏服务器
  • 登录服务器 Login Server,与网关服务器连接之前的登录业务
  • 中心服务器 Center Server,全局功能及消息推送
  • 游戏服务器 Game Server,游戏的核心场景实现
  • 存储服务器 Database Sever,数据库访问的连接代理

整体设计图

在这里插入图片描述

网关服务器

网络连接

  • 保持TCP连接
    • 实现多服特性时,客户端无需重新连接,提高切服的成功率和速度。
    • 对于无状态的Game Server,可以进行无感重启
    • 实现单点登录特性时,继承旧的会话,断开旧的连接,接入新的连接,无需下线
  • 流量限制
    • 防止用户通过单TCP连接内发出巨大流量,从而恶意消耗服务器的CPU资源
  • 横向扩展
    • 提高并发性能
    • 多个Gateway Server同时存在时,仍然实现单点登录特性,继承旧的会话,无需下线

消息处理

  • 消息内容压缩
    • 略微增加了CPU负载
    • 大量减少了服务器外网带宽消耗
    • 减少了传输延迟
  • 消息内容加密
    • 防止用户通过流量捕获软件获取数据包,识别内容涵义后,通过发包工具伪造数据包。
    • 消息内容中添加每次连接新生成的key,来防止用户通过录包软件发送固定的包序列充当机器人。
  • 消息序列(Sequence)验证
    • 判定客户端是否出现了发送消息的丢失或者异常
    • 防止用户通过录包软件重复发送单条消息
  • 消息完整性(CRC)验证
    • 判定切包正常
    • 判定数据包是否在通过网络层被更改过。
  • 消息时间戳验证
    • 检查消息包的时间戳,如果超时太久,则丢弃数据包。

权限管理

  • token验证
    • 通过客户端提供的token,验证接入权限
  • 黑名单
    • 获取玩家的用户id,查询用户权限,判定是否可以接入
  • 版本验证
    • 识别客户端多版本,提供多版本服务器路由支持
    • 识别客户端无效版本,提示升级客户端
  • 心跳
    • 心跳比TCP连接超时更为敏感,可覆盖更多类型的逻辑及网络异常,可及时释放连接。服务器负责监听会话的客户端心跳(PING),超时即主动断开,客户端会话也会监听服务器心跳(PONG),超时即主动断开
    • 通过心跳的时间戳来评估网络延迟,作为服务器故障判断的一种依据
    • 通过心跳的时间戳来评估网络延迟,在客户端显示网络信号状态
  • 强制下线
    • 当用户被判定为黑名单时,需要从Gateway Server上强制断开TCP连接,下次登录自动进入黑名单流程。

业务支持

  • 多级数据支持
    • 当Game Server仅拥有二级数据(比如游戏角色)的读写权限时,Gateway Server可以用来负责一级数据(比如账号昵称,创建角色)的读写业务。
  • 登录控制
    • 控制服务器的同时在线人数,尽量保证服务器的CPU使用率在50%以下,当同时在线人数超过阈值以后,不允许进入服务器,进入排队系统。
  • 排队系统
    • 玩家登录鉴权通过以后,如果当前在线人数过多,则保持登录连接,进入等待队列。
  • 在线统计
    • 通过有效连接数来统计总在线人数
  • 登录验证
    • Database登录,每次重连Gateway Server负责都去访问数据库中的账号数据表
    • Session登录, session过期前的第一次登录由Login Server访问数据库中的账号数据表,将session 键值对存入缓存。用户获得session key,在session过期前请求Gateway Server,服务器通过查询缓存进行鉴权
    • Token登录, session过期前第一次登录由Login Server访问数据库中的账号数据表,服务器不缓存token。用户获得token,在token过期前,请求Gateway Server,服务器通过算法获取token里面的加密信息进行鉴权

消息路由

  • 转发请求消息
    • 根据消息所带的组别,路由消息至对应的Game Server
    • 根据客户端所用版本,路由消息至对应的Game Server
  • 转发响应消息
    • 接收用户Id应该发出的消息,并向用户发出
    • 消息传输到错误的Gateway Server后,可以自动路由到正确的Gateway Server
    • 用户已经断开连接,丢弃数据包
  • 广播消息
    • 对于全局消息,接受消息后,遍历所有在线玩家进行发送
    • 对于特定的名单的消息,提供名单群体推送功能
    • 对于特定的频道的消息,提供频道群体推送功能

登录服务器

网络连接

  • Http服务器
    • 没有前置的Login Gateway Server,明文传输
  • TCP服务器
    • 前置Login Gateway Server,Login Gateway Server 是一个精简版的Gateway Server,仅仅用于数据包的编解码

用户注册

  • 创建新账号
    • 建立账号类型,账号名,账号id等信息
  • 支持多种用户类型
    • 游客账号
    • 自有平台账号
    • 手机账号,拥有短信验证绑定流程
    • 第三方登录,需要等待第三方服务器http验证,每一个渠道账号使用独立的mysql数据表

用户登录

  • 访问账号数据表
    • Session登录, Session过期前的第一次登录由Login Server访问数据库中的账号数据表,并将结果返回给客户端
    • Token登录,Token过期前的第一次登录由Login Server访问数据库中的账号数据表,并将结果返回给客户端

中心服务器

用户管理

  • 全局用户表
    • 所有Gateway Server和Game Server的登录都需要在Center Server注册,如果Center Server设计为多线程,则每次注册和反注册都要上锁。
  • 单点登录
    • 当相同玩家id从另一个Gateway节点登录的时候,通过全局用户表,寻找原来的用户的TCP连接所在的Gateway Server,重定向到原来的会话,取代旧的TCP连接

消息推送

  • 推送实现方式

    • 推送和全局用户表注册可以设计在一个线程当中,优势是可以不需要上锁,劣势是推送功能是非核心逻辑,全局用户表是核心逻辑,当推送达到性能瓶颈后,会影响核心逻辑的正常运行,降低了抗风险能力。
    • 推送和全局用户表不在同一个线程当中,优势是可以发挥多线程的逻辑优势,劣势是所有对全局表的访问需要上锁。
    • 推送独立进程,推送作为聊天服务器(Chat Server)独立存在,优势是和Center Server不会有性能影响,劣势是要达到数据实时互通,一种方式是Gateway Server同时注册到Center Server和Chat Server,另一种方式是Center Server主动同步数据给Chat Server
  • 全局广播

    • 标记类型为全局广播,发送给所有的Gateway Server,Gateway Server遍历所有连接,发送消息包。
  • 频道广播

    • 标记类型为频道广播,额外带上具体的频道号,频道数据保存在Gateway Server中,发送给所有Gateway Server,遍历所有连接,匹配频道,匹配成功发送消息包。
  • 名单广播

    • 维护特定的组织关系(例如公会),这个组织关系应当不在Game Server中体现,从Center Server中定位到具体Gateway Server,然后把名单和消息内容发给Gateway Server,Gateway Server比对名单内容,然后发送消息。
    • 私聊,指定特定玩家id进行通知,从Center Server中定位到具体Gateway Server,然后把名单和消息内容发给Gateway Server,Gateway Server比对名单内容,然后发送消息。

全局功能

  • 支付到账
  • 工会系统
  • 好友系统
  • 排行榜系统
  • 全局数据实时同步

游戏服务器

数据读取

  • 玩家数据读取
    • 当玩家进入Game Server时,注册到Center Server,同时Center Server通知原服务器把玩家数据在落地完成后清除,采用实时落地方案的话,则直接清除即可,Center Server通知当前服务器拉取玩家数据。
  • 游戏数据读取
    • 当进程启动时,从存储服务器中读取游戏场景需要的状态数据,数据与场景绑定,而不和玩家绑定

数据落地

  • 玩家数据落地
    • 非实时落地,则需要切换Game Server时,回存所有的玩家游戏数据,对数据库IOPS要求较低。
    • 定时落地,减少采用非实时落地方法在系统宕机后带来的回档损失。为了更加平稳的进行数据存储,在游戏业务允许的情况下,可以按照每秒存储一部分数据的分批存储模式。
    • 实时落地,数据发生修改后,立即异步通知存储服务器进行落地,对数据库IOPS要求较高。
  • 游戏场景的状态数据落地
    • 定时落地,每分钟或者每5分钟将数据整体落地一次。为了更加平稳的进行数据存储,在游戏业务允许的情况下,可以按照每秒存储一部分数据的分批存储模式。
    • 实时落地,当宕机发生以后带来的回档损失在1秒以内,对于玩家来说是无法感知回档的。

消息处理

  • 请求响应模式
    • 大部分消息满足一请求一返回的模式,玩家能在操作到达服务器后知道是否操作成功
  • 消息推送
    • Game Server的推送直接将消息转发给Gateway Server即可,Game Server需要记录玩家所在Gateway Server。
    • 一部分情况下,为了性能要求,放弃请求响应模式,定时推送消息,比如以服务器为中心的帧同步游戏。
    • 某些业务需要,一条请求多条返回,则第二条以后的消息都采用推送方式实现。
    • Game Server内业务广播,这里的广播范围往往和游戏逻辑挂钩,比如一个副本内的所有人,推送消息也往往和逻辑挂钩,直接遍历Game Server内的玩家列表推送至Gateway Server即可。

存储服务器

工作模式

  • 数据库直连型
    • 存储服务器,仅仅只是数据库集群,上层服务器,直接连接数据。
  • 线程池型
    • 存储服务器提供数据库连接,但是数据库操作的语句由上层服务器提供。
  • 业务代理型
    • 存储服务器接收自定义业务的命令,然后将命令转化为对应的数据库操作语句,操作完成以后返回结果
  • 数据缓存型
    • 在业务代理型的基础上,自身实现了一套缓存机制,在没有缓存的系统中,可以加速数据的存取效率。

数据一致性

  • 线程取模
    • 场景相关数据,按照场景或者子场景id取模选取读写线程,如何选取id取决于具体的子业务
    • 玩家相关数据,按照玩家id取模选取读写线程
  • 数据库上锁
    • mysql使用数据库行锁
    • mysql使用恰当的事务级别

依赖系统

服务发现

  • 注册服务被其他进程发现,被动建立连接
  • 通过服务发现寻找其他服务,主动建立连接

消息队列

  • 直连型
    • Zeromq
  • 服务型
    • Rocketmq
    • Rabbitmq

存储系统

  • 缓存型
    • Redis
    • Memcache
  • 存储型
    • Mongodb
    • Mysql
  • 混合型
    • Pika
    • Ssdb
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式游戏服务器设计 的相关文章

  • Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答

    最近做数据处理时候 xff0c 遇到一个问题 用一个id自增主键时候 xff0c 数据表中会插入大量重复数据 xff08 除ID不同 xff09 这虽然对最终数据处理结果没有影响 xff0c 但是有1个问题 xff0c 如果数据量超大 xf
  • 2014年秋找工作经历

    博主学渣一枚 xff0c 读研期间做过几个不上档次的管理系统 xff0c 学历不太好 xff0c 基础知识不太牢固 xff0c 所以校招找工作难免辛酸 记下这个过程 xff0c 以便日后回顾来时的路 9月 xff0c 酱油了 xff0c 只
  • 服务器端获取webservice客户端IP地址

    一 基于xfire发布的webservice获取客户端ip的方法 public String getClientIp String ip 61 34 34 try HttpServletRequest request 61 XFireSer
  • @Autowired,@Qualifier @Required @Resource @Component,@Service,@Controller,@Repository @PostConstruct

    1 64 Autowired 注解 xff1a 首先在使用时候需要引入配置 xff1a lt 该 BeanPostProcessor 将自动起作用 xff0c 对标注 64 Autowired 的 Bean 进行自动注入 gt lt bea
  • HTML中select标签单选多选详解

    select 元素可创建单选或多选菜单 当提交表单时 xff0c 浏览器会提交选定的项目 xff0c 或者收集用逗号分隔的多个选项 xff0c 将其合成一个单独的参数列表 xff0c 并且在将 lt select gt 表单数据提交给服务器
  • Centos7中语言如何设置成中文

    Centos系统作为开源最优秀的Linux版本 xff0c 我们在阿里云官方镜像站 xff1a https developer aliyun com mirror 找到所需Centos版本并下载安装后 xff0c 可能未注意指定系统语言 x
  • Tomcat正常启动,访问所有页面均报404异常,404异常总结

    今天遇到一个问题 xff1a Tomcat正常启动 xff0c 访问所有页面均报404异常 404异常 xff0c 很常见 xff0c 大多情况是路径错误 web xml文件映射路径写错 服务器设置 servlet的jar包未导进去或者没有
  • oracle中游标详细用法

    游标的概念 游标是SQL的一个内存工作区 xff0c 由系统或用户以变量的形式定义 游标的作用就是用于临时存储从数据库中提取的数据块 在某些情况下 xff0c 需要把数据从存放在磁盘的表中调到计算机内存中进行处理 xff0c 最后将处理结果
  • 连接2个字符串,strcat函数。

    题目描述 设计函数连接2个字符串 单个字符串的长度不超过100 不要使用系统提供的strcat函数 输入要求 输入2个字符串 xff0c 每个字符串以换行符结束 保证每个字符串中不会出现空格 输出要求 输出连接好的字符串 输入样例 Coun
  • git 下载指定历史版本

    1 选中想回退到的commit记录 xff0c 点击如图 2 选中Hard xff0c 表示该记录之后的改动全部丢弃 3 操作完之后代码会回滚到选中的位置 xff0c 这个时候不要拉取代码 xff0c 不然又拉回来了 xff1b 直接在现有
  • 摄像机内参、外参矩阵

    摄像机矩阵由P由内参矩阵和外参矩阵组成 xff0c 对摄像机矩阵进行QR分解可以得到内参矩阵和外参矩阵 在opencv的3D重建中 xff08 opencv中文网站中 xff1a 照相机定标与三维场景重建 xff09 xff0c 对摄像机的
  • 几个简单的数据点平滑处理算法

    最近在写一些数据处理的程序 经常需要对数据进行平滑处理 直接用FIR滤波器或IIR滤波器都有一个启动问题 xff0c 滤波完成后总要对数据掐头去尾 因此去找了些简单的数据平滑处理的方法 在一本老版本的 数学手册 中找到了几个基于最小二乘法的
  • 陶哲轩实分析 3.5 节习题试解

    3 5 1 第一种定义 xff1a x y 61
  • C++ 中的 std::pair 和 std::tuple

    C 43 43 中的 std pair 和 std tuple 最近在看 C 43 43 11 的标准 xff0c 发现了 std pair 和 std tuple 感觉这两个非常有用 就在这里记录一下 std pair 出现的比较早 xf
  • OpenCV 真圆度测量

    OpenCV 真圆度测量 最近一个项目需要在图像上测量一些小孔的真圆度 因此专门研究了一下真圆度计算问题 对于一个轮廓 xff0c 我们可以求出这个轮廓的外接圆和内切圆 这两个圆的半径差定义为真圆度 这个数值越小 xff0c 表示这个圆越标
  • 如何修改 CentOS 系统最大线程数

    简介 xff1a 本文主要介绍如何修改CentOS系统最大线程数 镜像下载 域名解析 时间同步请点击 阿里巴巴开源镜像站 1 安装ElasticSearch后 xff0c 配置完成 xff0c 启动服务 xff0c 系统显示类似如下 max
  • MathJax 支持的 Latex 符号总结(各种箭头符号)

    箭头符号 latex显示效果 uparrow downarrow Uparrow Downarrow updownarrow Updownarrow rightarrow
  • C++ 复制构造函数不能用 explicit 修饰

    最近在写的一个代码 出现个莫名其妙的编译问题 代码可以简化成这样 xff1a class foo span class hljs keyword public span span class hljs title foo span span
  • FreeRTOS 源码注释(vTaskDelete)

    void vTaskDelete xTaskHandle pxTaskToDelete tskTCB pxTCB taskENTER CRITICAL if pxTaskToDelete 61 61 pxCurrentTCB pxTaskT
  • 循环冗余校验(CRC)算法入门引导

    写给嵌入式程序员的循环冗余校验 xff08 CRC xff09 算法入门引导 前言 CRC校验 xff08 循环冗余校验 xff09 是数据通讯中最常采用的校验方式 在嵌入式软件开发中 xff0c 经常要用到CRC 算法对各种数据进行校验

随机推荐

  • FreeRTOS 移植要点(2)

    port c port c 中主要实现了几个函数 xff1a pxPortInitialiseStack xPortStartScheduler vPortEndScheduler vPortYield vPortTickInterrupt
  • DLA (扩散限制凝聚)模型的计算机模拟

    几年前写的一个小程序 xff0c 最近找到了 程序写的比较简单 xff0c 也没做什么优化 对正在学习计算物理的同学可能会有点帮助 下面关于DLA 模型的介绍来自百度百科 Diffusion limited Aggregation xff0
  • matlab 读取处理 wav 文件

    最近工作需要 xff0c 要对wav 文件中存储的声音信息进行分析处理 所以花了些时间收集了各种数学软件中处理 wav 文件的方法 Matlab Matlab 是最方便的 甚至于不用写任何代码就能读取 wav 文件 xff08 我用的是 m
  • Savitzky-Golay 滤波器

    Savitzky Golay滤波器 xff08 通常简称为S G滤波器 xff09 最初由Savitzky 和 Golay 于 1964 年提出 xff0c 发表于Analytical Chemistry 杂志 之后被广泛地运用于数据流平滑
  • 关于查看ros中可以安装的功能包

    可以通过以下命令查看软件库中是否包含你所需要的功能包 apt cache search xxxx 其中xxx为你要搜索的关键字
  • 教你如何用原生css和html搭建一个好看的Table表格

    前言 大家在学习 lt table gt 标签的时候 xff0c 可能还没有接触css xff0c 所以你做出来的表格可能是这样的 xff1a 或者是这样的 xff1a 大家有想过自己做一个漂亮的表格吗 xff1f 我知道大家在做项目的时候
  • 如何在 Ubuntu 20.04 启用 SSH

    简介 xff1a Secure Shell SSH 是一个网络协议 xff0c 它主要被用来加密客户端和服务端之间的连接 在客户端和服务端的每一次交互都被加密 本文主要为大家讲解如何在 Ubuntu 20 04 启用 SSH 镜像下载 域名
  • 树莓派镜像SD卡烧录成功磁盘没内容解决方法

    这个情况很可能是删除分区后发生的 xff0c 只需要此电脑 管理 磁盘管理 驱动器路径 添加 确定就可以解决了
  • C++ 类学习总结(五) 继承与多态

    继承 基本概念 xff0e 基类 xff1a 可供其他类继承的类 xff0c 基类的成员也将成为派生类的成员 xff0e 派生类 xff1a 从基类继承而来的类 xff0c 称为派生类 xff0e 虚函数 xff1a 基类中希望其派生类可以
  • 行业术语 英文

    IDE 一般指集成开发的环境 如QT Creator Visual Studio等 Application framework 一般指的是应用程序框架 xff08 包含 XML xff0c GUI组件 xff0c 程序 xff0c 网络框架
  • VSCode C/C++ 格式化配置【最完整准确版本】

    一 下载Clang format 1 在VSCode插件商店下载 C C 43 43 插件 和 Clang format 插件 二 生成 clang format 文件 2 去到 C Users lt 你的用户名 gt vscode ext
  • 【时间规划】C/C++发展之路--读书

    0 xff1a 图书馆的N本C xff0c C 43 43 书 1 xff1a C语言深度解剖 2 xff1a 高质量C 43 43 c编程指南 3 xff1a C 43 43 primer第四版 4 xff1a Windows程序设计 5
  • 【Cocos2d-x】Win7+ vs2012,2010 + Cocos2d-x2.2 配置Cocos2d-X项目-环境

    新安装搭建cocos2d X的跳过这里 xff0c 看下面红色开始 xff1a cocos2d x删除vs2012项目模板 这一步新使用cocos2d x的不需要 如果你切换cocos2d x版本的话 xff0c 要将之前版本的vs模板删除
  • 【Cocos2d-x】Cocos2d-x参考案例源码解析之一:Cocos2dx各个文件说明

    这里本人电脑配置是win7 64位 xff0c cocos2d x2 20 xff0c VS2012 1 xff1a 首先当然是下载cocos2d x啦 我采用的是2 20版本 说明 xff1a 2 14以后的版本和之前的VS模板生成和环境
  • 【Cocos2d-x】Cocos2d-x参考案例源码解析之三:HelloWorld

    允许我讲些与源码无关的事情 xff01 稍后K我 由于cocos2dX3 0快出来了 xff0c 官网上说放弃objective c风格 xff0c 本屌学的是C 43 43 xff0c 所以真是太高兴了 xff0c 所以放慢的源码解析 x
  • 【Cocos2d-x】Cocos2d-x跨Android平台搭建之四:Win7 64位+ eclipse + cocos2dX

    开始研究cocos2dx xff0c mark一下这个的配置步骤 1 下载eclipse 2 下载android sdk xff0c 配置sdk路径 xff0c 添加环境变量 3 安装adt 4 下载android ndk xff0c 配置
  • 【网络通信】Wince 和 PC 通过USB 用Socket 进行通信

    网上资料比较少或者说讲的不太详细 xff0c 现在进行总结下 xff0c 刚毕业没接触过WINce xff0c 不过和MFC差不多 xff0c 现在进入正题 刚开始我的疑惑是Wince是如何和PC进行通信的 xff0c 以及能在USB模式下
  • 如何在 Ubuntu 20.04 上添加交换空间

    简介 xff1a 本文主要为大家讲解如何在 Ubuntu 20 04上添加并激活一个交换空间 镜像下载 域名解析 时间同步请点击 阿里巴巴开源镜像站 交换空间是硬盘上的一个空间 xff0c 当物理 RAM 内存被用尽时 xff0c 被紧急征
  • VScode+Sphinx+ReadTheDocs 从环境搭建到放弃

    概述 此篇博客用来记录在windows10中配置环境的过程 xff0c 注意是Windows下 xff0c 我没有在Linux下面尝试过配置 一下参考了各路教程加上自己亲测 xff0c 应该是没有问题的 被掏空 目录 概述 目录材料清单工具
  • 分布式游戏服务器设计

    分布式游戏服务器设计 服务器解释整体设计图网关服务器网络连接消息处理权限管理业务支持消息路由 登录服务器网络连接用户注册用户登录 中心服务器用户管理消息推送全局功能 游戏服务器数据读取数据落地消息处理 存储服务器工作模式数据一致性 依赖系统