分布式游戏服务器设计

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

服务器解释

  • 网关服务器 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

分布式游戏服务器设计相关推荐

  1. Unity3damp;amp;C#分布式游戏服务器ET框架介绍-组件式设计

    前几天写了<开源分享 Unity3d客户端与C#分布式服务端游戏框架>,受到很多人关注,QQ群几天就加了80多个人.开源这个框架的主要目的也是分享自己设计ET的一些想法,所以我准备写一系列 ...

  2. 分布式游戏服务器通用架构的设计

    对于游戏服务器架构,不同项目除了游戏玩法.匹配规则大不相同外,其余部分如日志系统.TCP 连接管理,玩家数据存储,数据库连接与访问等大同小异.游戏服务器架构中高并发.可扩展是主要的设计点.本 Chat ...

  3. python游戏服务器框架_mqant首页、文档和下载 - Golang/python语言开发的分布式游戏服务器框架 - OSCHINA - 中文开源技术交流社区...

    mqant mqant 是一款基于 Golang 语言的简洁,高效,高性能的分布式游戏服务器框架,研发的初衷是要实现一款能支持高并发,高性能,高实时性的游戏服务器框架,也希望 mqant 未来能够做即 ...

  4. Wind分布式游戏服务器引擎的实现

    Wind Wind是一款面向云的高性能.高效率以及高扩展性的大型分布式游戏服务器引擎.Wind利用Python语言的简洁语法以及丰富的生态库来提高游戏业务的开发效率,针对一些对性能有要求的游戏业务功能 ...

  5. Wind:一款面向云的分布式游戏服务器引擎

    Wind是一款面向云的高性能.高效率以及高扩展性的大型分布式游戏服务器引擎.Wind利用Python语言的简洁语法以及丰富的生态库来提高游戏业务的开发效率,针对一些对性能有要求的游戏业务功能(如实时战 ...

  6. (转)FPS游戏服务器设计的问题

    FPS游戏服务器设计的问题 出处:http://www.byteedu.com/thread-20-1-1.html 一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称 ...

  7. FPS游戏服务器设计的问题

    一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时 ...

  8. FPS游戏服务器设计的问题 转

    一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时 ...

  9. 游戏服务器设计之NPC系统

    游戏服务器设计之NPC系统 简介 NPC系统是游戏中非常重要的系统,设计的好坏很大程度上影响游戏的体验.NPC在游戏中有如下作用: 引导玩家体验游戏内容,一般游戏内有很多主线.支线任务,而任务的介绍. ...

  10. 游戏服务器设计之任务系统

    游戏服务器设计之任务系统 介绍 任务系统是游戏中最重要的系统之一,本文旨在设计一个轻量清晰的任务系统.通用易扩展是本系统关注的重点.任务系统中当角色的条件满足时,自动触发每一类型的任务,每个任务有其所 ...

最新文章

  1. 第二十二课.XGBoost
  2. Python标准库04 文件管理 (部分os包,shutil包)
  3. cad怎么调出科创易达绿化_【每日问答26】如何识别CAD图纸dwg格式版本?(内含往期)...
  4. 安装模块时提示Collecting package metadata (repodata.json): failed
  5. MySQL的sql_mode解析与设置
  6. MPEG音视频编解码之MP3编解码概述
  7. python中for语句涉及的序列可以是关系表达式吗_为什么我可以在Python for循环中为迭代器和序列使用相同的名称?...
  8. 一文读懂cooie和session
  9. 点云数据格式及处理工具
  10. E-Prime2.0安装避坑指南
  11. ul1581标准_UL1581标准中文版-2019电线电缆和软线的UL中文版标准.pdf
  12. Excel学习 -- 函数基础
  13. 《给QTreeView表项添加CheckBox和图标》:系列教程之七
  14. Int与byte[]互转详解分析
  15. vue3-proxy
  16. mysql.sock 是什么_mysql.sock到底存了什么信息?
  17. css translate 坐标,translate()
  18. 纸壳CMS 3.3.6发布升级.Net 5
  19. 信创办公--基于WPS的Word最佳实践系列(汇总目录)
  20. python update函数会调用哪些内置函数_Python函数之内置函数

热门文章

  1. libdbus 实例以及使用d-feet查看接口方法
  2. 打包一个包含手表端应用的手机端APK应用—Ticwear
  3. Linux下查看输入设备、获取输入事件的详细方法
  4. STM32通过esp8266获取心知天气数据(hal库)
  5. Mybatis学习之路(二):property元素应用
  6. 苹果手机话筒声音小怎么办_苹果xr听筒声音小,苹果xr通话声音小
  7. ecshop模板中使用php,使ecshop模板中可引用常量的实现方法_php
  8. 火箭发射:点击率预估界的“神算子”是如何炼成的?
  9. javascript数组
  10. [轻笔记]Juliav0.6配置jupyter