服务器常用基本框架_第1页
服务器常用基本框架_第2页
服务器常用基本框架_第3页
服务器常用基本框架_第4页
服务器常用基本框架_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

转自知乎 类型类型 1 卡牌 跑酷等弱交互服务端 卡牌 跑酷等弱交互服务端 卡牌跑酷类因为交互弱 玩家和玩家之间不需要实时面对面 PK 打一下对方的离线数据 计 算下排行榜 买卖下道具即可 所以实现往往使用简单的 HTTP 服务器 登录时 可以使用非对称加密 RSA DH 服务器根据客户端 uid 当前时间戳还有服务端私钥 计 算哈希得到的加密 key 并发送给客户端 之后双方都用 HTTP 通信 并用那个 key 进行 RC4 加密 客户端收到 key 和时间戳后保存在内存 用于之后通信 服务端不需要保存 key 因为 每次都可以根据客户端传上来的 uid 和 时间戳 以及服务端自己的私钥计算得到 用模仿 TLS 的行为 来保证多次 HTTP 请求间的客户端身份 并通过时间戳保证同一人两次登录密钥不同 登录时可以使用非 对称加密 RSA DH 服务器根据客户端 uid 当前时间戳还有服务端私钥 计算哈希得到 的加密 key 并发送给客户端 之后双方都用 HTTP 通信 并用那个 key 进行 RC4 加密 客户 端收到 key 和时间戳后保存在内存 用于之后通信 服务端不需要保存 key 因为每次都可以 根据客户端传上来的 uid 和 时间戳 以及服务端自己的私钥计算得到 用模仿 TLS 的行为 来 保证多次 HTTP 请求间的客户端身份 并通过时间戳保证同一人两次登录密钥不同 每局开始时 访问一下 请求一下关卡数据 玩完了又提交一下 验算一下是否合法 获得什 么奖励 数据库用单台 MySQL 或者 MongoDB 即可 后端的 Redis 做缓存 可选 如果要 实现通知 那么让客户端定时 15 秒轮询一下服务器 如果有消息就取下来 如果没消息可以 逐步放长轮询时间 比如 30 秒 如果有消息 就缩短轮询时间到 10 秒 5 秒 即便两人聊天 延迟也能自适应 此类服务器用来实现一款三国类策略或者卡牌及酷跑的游戏已经绰绰有余 这类游戏因为逻辑 简单 玩家之间交互不强 使用 HTTP 来开发的话 开发速度快 调试只需要一个浏览器就可 以把逻辑调试清楚了 类型类型 2 第一代游戏服务器 第一代游戏服务器 1978 1978 年 英国著名的财经学校 University of Essex 的学生 Roy Trubshaw 编写了世界上第一个 MUD 程序 MUD1 在 University of Essex 于 1980 年接入 ARPANET 之后加入了不少外部 的玩家 甚至包括国外的玩家 MUD1 程序的源代码在 ARPANET 共享之后出现了众多的 改编版本 至此 MUD 才在全世界广泛流行起来 不断完善的 MUD1 的基础上产生了开源的 MudOS 1991 成为众多网游的鼻祖 MUDOS 采用 C 语言开发 因为玩家和玩家之间有比较强的交互 聊天 交易 PK MUDOS 使用单线程无 阻塞套接字来服务所有玩家 所有玩家的请求都发到同一个线程去处理 主线程每隔 1 秒钟更 新一次所有对象 网络收发 更新对象状态机 处理超时 刷新地图 刷新 NPC MUDOS 采用 C 语言开发 因 为玩家和玩家之间有比较强的交互 聊天 交易 PK MUDOS 使用单线程无阻塞套接字来 服务所有玩家 所有玩家的请求都发到同一个线程去处理 主线程每隔 1 秒钟更新一次所有对 象 网络收发 更新对象状态机 处理超时 刷新地图 刷新 NPC 游戏世界采用房间的形式组织起来 每个房间有东南西北四个方向可以移动到下一个房间 由 于欧美最早的网游都是地牢迷宫形式的 因此场景的基本单位被成为 房间 MUDOS 使用一 门称为 LPC 的脚本语言来描述整个世界 包括房间拓扑 配置 NPC 以及各种剧情 游 戏里面的高级玩家 巫师 可以不断的通过修改脚本来为游戏添加房间以及增加剧情 早年 MUD1 上线时只有 17 个房间 Roy Trubshaw 毕业以后交给他的师弟 Richard Battle 在 Richard Battle 手上 不断的添加各种玩法到一百多个房间 终于让 MUD 发扬光大 用户使用 Telnet 之类的客户端用 Tcp 协议连接到 MUDOS 上 使用纯文字进行游戏 每条指 令用回车进行分割 比如 1995 年国内第一款 MUD 游戏 侠客行 你敲入 go east 游 戏就会提示你 后花园 这里是归云庄的后花园 种满了花草 几个庄丁正在浇花 此地乃是 含羞草生长之地 这里唯一的出口是 north 这里有 花待 阿牧 A mu 还有二位庄丁 Zhuang Ding 然后你继续用文字操作 查看阿牧的信息 look a mu 系统提示 花待 阿牧 A mu 他是陆乘风的弟子 受命在此看管含羞草 他看起来三十多岁 生得眉清目秀 端正大方 一表人才 他的武艺看上去 不是很高 出手似乎 极轻 然后你可以选择击 败他获得含羞草 但是你吃了含羞草却又可能会中毒死亡 在早期网上资源贫乏的时候 这样 的游戏有很强的代入感 用户数据保存在文件中 每个用户登录时 从文本文件里把用户的数据全部加载进来 操作全 部在内存里面进行 无需马上刷回磁盘 用户退出了 或者每隔 5 分钟检查到数据改动了 都 会保存会磁盘 这样的系统在当时每台服务器承载个 4000 人同时游戏 不是特别大的问题 从 1991 年的 MUDOS 发布后 全球各地都在为他改进 扩充 退出新版本 随着 Windows 图形机能的增强 1997 游戏 UO 在 MUDOS 的基础上为角色增加的 x y 坐标 为每个房间 增加了地图 并且为每个角色增加了动画 形成了第一代的图形网络游戏 因为游戏内容基本可以通过 LPC 脚本进行定制 所以 MUDOS 也成为名副其实的第一款服务 端引擎 引擎一次性开发出来 然后制作不同游戏内容 后续国内的 万王之王 等游戏 很 多都是跟 UO 一样 直接在 MUDOS 上进行二次开发 加入房间的地图还有角色的坐标等 要素 该架构一直为国内的第一代 MMORPG 提供了稳固的支持 直到 2003 年 还有游戏基 于 MUDOS 开发 虽然后面图形化增加了很多东西 但是这些 MMORPG 后端的本质还是 MUDOS 随着游戏内 容的越来越复杂 架构变得越来越吃不消了 各种负载问题慢慢浮上水面 于是有了我们的第 二代游戏服务器 类型类型 3 第二代游戏服务器 第二代游戏服务器 2003 2000 年后 网游已经脱离最初的文字 MUD 进入全面图形化年代 最先承受不住的其实是很 多小文件 用户上下线 频繁的读取写入用户数据 导致负载越来越大 随着在线人数的增加 和游戏数据的增加 服务器变得不抗重负 同时早期 EXT 磁盘分区比较脆弱 稍微停电 容易 发生大面积数据丢失 因此第一步就是拆分文件存储到数据库去 此时游戏服务端已经脱离陈旧的 MUDOS 体系 各个公司在参考 MUDOS 结构的情况下 开始 自己用 C 在重新开发自己的游戏服务端 并且脚本也抛弃了 LPC 采用扩展性更好的 Python 或者 Lua 来代替 由于主逻辑使用单线程模型 随着游戏内容的增加 传统单服务器的结构进 一步成为瓶颈 于是有人开始拆分游戏世界 变为下面的模型 游戏服务器压力拆 分后得意缓解 但是两台游戏服务器同时访问数据库 大量重复访问 大量数据交换 使得数 据库成为下一个瓶颈 于是形成了数据库前端代理 DB Proxy 游戏服务器不直接访问数据 库而是访问代理 再有代理访问数据库 同时提供内存级别的 cache 早年 MySQL4 之前没有 提供存储过程 这个前端代理一般和 MySQL 跑在同一台上 它转化游戏服务器发过来的高级 数据操作指令 拆分成具体的数据库操作 一定程度上代替了存储过程 游戏服务器压力拆分后得 意缓解 但是两台游戏服务器同时访问数据库 大量重复访问 大量数据交换 使得数据库成 为下一个瓶颈 于是形成了数据库前端代理 DB Proxy 游戏服务器不直接访问数据库而是 访问代理 再有代理访问数据库 同时提供内存级别的 cache 早年 MySQL4 之前没有提供存 储过程 这个前端代理一般和 MySQL 跑在同一台上 它转化游戏服务器发过来的高级数据操 作指令 拆分成具体的数据库操作 一定程度上代替了存储过程 但是这样 的结构并没有持续太长时间 因为玩家切换场景经常要切换连接 中间的状态容易错乱 而且 游戏服务器多了以后 相互之间数据交互又会变得比较麻烦 于是人们拆分了网络功能 独立 出一个网关服务 Gate 有的地方叫 Session 有的地方叫 LinkSvr 之类的 名字不同而已 但是这样的结 构并没有持续太长时间 因为玩家切换场景经常要切换连接 中间的状态容易错乱 而且游戏 服务器多了以后 相互之间数据交互又会变得比较麻烦 于是人们拆分了网络功能 独立出一 个网关服务 Gate 有的地方叫 Session 有的地方叫 LinkSvr 之类的 名字不同而已 把网络功 能单独提取出来 让用户统一去连接一个网关服务器 再有网关服务器转发数据到后端游戏服 务器 而游戏服务器之间数据交换也统一连接到网管进行交换 这样类型的服务器基本能稳定 的为玩家提供游戏服务 一台网关服务 1 2 万人 后面的游戏服务器每台服务 5k 1w 依游戏 类型和复杂度不同而已 图中隐藏了很多不重要的服务器 如登录和管理 这是目前应用最广 的一个模型 到今天任然很多新项目会才用这样的结构来搭建 把网络功 能单独提取出来 让用户统一去连接一个网关服务器 再有网关服务器转发数据到后端游戏服 务器 而游戏服务器之间数据交换也统一连接到网管进行交换 这样类型的服务器基本能稳定 的为玩家提供游戏服务 一台网关服务 1 2 万人 后面的游戏服务器每台服务 5k 1w 依游戏 类型和复杂度不同而已 图中隐藏了很多不重要的服务器 如登录和管理 这是目前应用最广 的一个模型 到今天任然很多新项目会才用这样的结构来搭建 人都是有惯性的 按照先前的经验 似乎把 MUDOS 拆分的越开性能越好 于是大家继续想 网关可以拆分呀 基础服务如聊天交易 可以拆分呀 还可以提供 web 接口 数据库可以拆分 呀 于是有了下面的模型 这样的模 型好用么 确实有成功游戏使用类似这样的架构 并且发挥了它的性能优势 比如一些大型 MMORPG 但是有两个挑战 每增加一级服务器 状态机复杂度可能会翻倍 导致研发和找 bug 的成本上升 并且对开发组挑战比较大 一旦项目时间吃紧 开发人员经验不足 很容易 弄挂 这样 的模型好用么 确实有成功游戏使用类似这样的架构 并且发挥了它的性能优势 比如一些大 型 MMORPG 但是有两个挑战 每增加一级服务器 状态机复杂度可能会翻倍 导致研发和 找 bug 的成本上升 并且对开发组挑战比较大 一旦项目时间吃紧 开发人员经验不足 很容 易弄挂 比如我见过某上海一线游戏公司的一个 RPG 上来就要上这样的架构 我看了下他们团队成员 的经验 问了下他们的上线日期 劝他们用前面稍微简单一点的模型 人家自信得很 认为有 成功项目是这么做的 他们也要这么做 自己很想实现一套 于是他们义无反顾的开始编码 项目做了一年多 然后 就没有然后了 现今在游戏成功率不高的情况下 一开始上一套比较复杂的架构需要考虑投资回报率 比如你 的游戏上线半年内 PCU 会去到多少 如果一个 APRG 游戏 每组服务器 5 千人都到不了的话 那么选择一套更为贴近实际情况的结构更为经济 即使后面你的项目真的超过 5 千人朝着 1 万 人目标奔的话 相信那个时候你的项目已经挣大钱了 你数着钱加着班去逐步迭代 一次次拆 分它 相信心里也是乐开花的 上面这些类型基本都是从拆分 MUDOS 开始 将 MUDOS 中的各个部件从单机一步步拆成分布 式 虽然今天任然很多新项目在用上面某一种类似的结构 或者自己又做了其他热点模块的拆 分 因为他们本质上都是对 MUDOS 的分解 故将他们归纳为第二代游戏服务器 类型类型 4 第三代游戏服务器 第三代游戏服务器 2007 从魔兽世界开始无缝世界地图已经深入人心 比较以往游戏玩家走个几步还需要切换场景 每 次切换就要等待 LOADING 个几十秒是一件十分破坏游戏体验的事情 于是对于 2005 年以后 的大型 MMORPG 来说 无缝地图已成为一个标准配置 比较以往按照地图来切割游戏而言 无缝世界并不存在一块地图上面的人有且只由一台服务器处理了 每台 Node 服务器用来管理一块地图区域 由 NodeMaster NM 来为他们提供总体管理 更 高层次的 World 则提供大陆级别的管理服务 这里省略若干细节服务器 比如传统数据库前端 登录服务器 日志和监控等 统统用 ADMIN 概括 在这样的结构下 玩家从一块区域走向另 外一块区域需要简单处理一下 玩家 1 完全由节点 A 控制 玩家 3 完全由节点 B 控制 而处在两个节点边缘的 2 号玩家 则同时由 A 和 B 提供 服务 玩家 2 从 A 移动到 B 的过程中 会同时向 A 请求左边的情况 并向 B 请求右边的情况 但是此时玩家 2 还是属于 A 管理 直到玩家 2 彻底离开 AB 边界很远 才彻底交由 B 管理 按 照这样的逻辑将世界地图分割为一块一块的区域 交由不同的 Node 去管理 玩家 1 完全由节点 A 控制 玩家 3 完全由节点 B 控制 而处在两个节点边缘的 2 号玩家 则同时由 A 和 B 提供服务 玩 家 2 从 A 移动到 B 的过程中 会同时向 A 请求左边的情况 并向 B 请求右边的情况 但是此 时玩家 2 还是属于 A 管理 直到玩家 2 彻底离开 AB 边界很远 才彻底交由 B 管理 按照这样 的逻辑将世界地图分割为一块一块的区域 交由不同的 Node 去管理 对于一个 Node 所负责的区域 地理上没必要连接在一起 比如大陆的四周边缘部分和高山部 分的区块人比较少 可以统一交给一个 Node 去管理 而这些区块在地理上并没有联系在一起 的必要性 一个 Node 到底管理哪些区块 可以根据游戏实时运行的负载情况 定时维护的时 候进行更改 NodeMaster 上面的配置 于是碰到第一个问题是很多 Node 服务器需要和玩家进行通信 需要问管理服务器特定 UID 为 多少的玩家到底在哪台 Gate 上 以前按场景切割的服务器这个问题不大 问了一次以后就可 以缓存起来了 但是现在服务器种类增加不少 玩家又会飘来飘去 按 UID 查找玩家比较麻烦 另外一方面 GATE 需要动态根据坐标计算和哪些 Node 通信 导致逻辑越来越厚 于是把 用 户对象 从负责连接管理的 GATE 中切割出来势在必行于是有了下面的模型 网关服务器再次退 回到精简的网络转发功能 而用户逻辑则由按照 UID 划分的 OBJ 服务器来承担 GATE 是按 照网络接入时的负载来分布 而 OBJ 则是按照资源的编号 UID 来分布 这样和一个用户通 信直接根据 UID 计算出 OBJ 服务器编号发送数据即可 而新独立出来的 OBJ 则提供了更多高 层次的服务 网关服 务器再次退回到精简的网络转发功能 而用户逻辑则由按照 UID 划分的 OBJ 服务器来承担 GATE 是按照网络接入时的负载来分布 而 OBJ 则是按照资源的编号 UID 来分布 这样和 一个用户通信直接根据 UID 计算出 OBJ 服务器编号发送数据即可 而新独立出来的 OBJ 则提 供了更多高层次的服务 对象移动 管理具体玩家在不同的 Node 所管辖的区域之间的移动 并同需要的 Node 进行沟 通 数据广播 Node 可以给每个用户设置若干 TAG 然后通知 Object Master 按照 TAG 广播 对象消息 通用消息推送 给某个用户发送数据 直接告诉 OBJ 不需要直接和 GATE 打交道 好友聊天 角色之间聊天直接走 OBJ OBJ MASTER 整个服务器主体分为三层以后 NODE 专注场景 OBJ 专注玩家对象 GATE 专注网络 这样 的模型在无缝场景服务器中得到广泛的应用 但是随着时间的推移 负载问题也越来越明显 做个活动 远来不活跃的区域变得十分活跃 靠每周维护来调整还是比较笨重的 于是有了动 态负载均衡 动态负载均衡有两种方法 第一种是按照负载 由 Node Master 定时动态移动修改一下各个 Node 的边界 而不同的玩家对象按照先前的方法从一台 Node 上迁移到另外一台 Node 上 图 11 动态负载均 衡 图 11 动态负载均衡 这样 Node Master 定时查找地图上的热点区域 计算新的场景切割方式 然后告诉其他服务器 开始调整 具体处理方式还是和上面对象跨越边界移动的方法一样 但是上面这种方式实现相对复杂一些 于是人们设计出了更为简单直接的一种新方法 图 12 基于网格的 动态负载均衡 图 12 基于网格的动态负载均衡 还是将地图按照标准尺寸均匀切割成静态的网格 每个格子由一个具体的 Node 负责 但是根 据负载情况 能够实时的迁移到其他 Node 上 在迁移分为三个阶段 准备 切换 完成 三 个状态由 Node Master 负责维护 准备阶段新的 Node 开始同步老 Node 上面该网格的数据 完成后告诉 NM NM 确认 OK 后同时通知新旧 Node 完成切换 完成切换后 如果 Obj 服务 器还在和老的 Node 进行通信 老的 Node 将会对它进行纠正 得到纠正的 OBJ 将修正自己的 状态 和新的 Node 进行通信 很多无缝动态负载均衡的服务端宣称自己支持无限的人数 但不意味着 MMORPG 游戏的人数 上限真的可以无限扩充 因为这样的体系会受制于网络带宽和客户端性能 带宽决定了同一个 区域最大广播上限 而客户端性能决定了同一个屏幕到底可以绘制多少个角色 从无缝地图引入了分布式对象模型开始 已经完全脱离 MUDOS 体系 成为一种新的服务端模 型 又由于动态负载均衡的引入 让无缝服务器如虎添翼 容纳着超过上一代游戏服务器数倍 的人数上限 并提供了更好的游戏体验 我们称其为第三代游戏服务端架构 网游以大型多人 角色扮演为开端 RPG 网游在相当长的时间里一度占据 90 以上 使得基于 MMORPG 的服 务端架构得到了蓬勃的发展 然而随着玩家对 RPG 的疲惫 各种非 MMORPG 游戏如雨后春 笋般的出现在人们眼前 受到市场的欢迎 类型类型 5 战网游戏服务器 战网游戏服务器 经典战网服务端和 RPG 游戏有两个区别 RPG 是分区分服的 北京区的用户和广州区的用户 老死不相往来 而战网 虽然每局游戏一般都是 8 人以内 但全国只有一套服务器 所有的玩 家都可以在一起游戏 而玩家和玩家之使用 P2P 的方式连接在一起 组成一局游戏 玩家通过 Match Making 服务器使用 创建 加入 自动匹配 邀请 等方式组成一局游戏 服务器会选 择一个人做 Host 其他人 P2P 连接到做主的玩家上来 STUN 是帮助玩家之间建立 P2P 的牵 引服务器 而由于 P2P 联通情况大概只有 75 实在联不通的玩家会通过 Forward 进行转发 玩家通过 Match Making 服务器使用 创建 加入 自动匹配 邀请 等方式组成一局游戏 服务器会选 择一个人做 Host 其他人 P2P 连接到做主的玩家上来 STUN 是帮助玩家之间建立 P2P 的牵 引服务器 而由于 P2P 联通情况大概只有 75 实在联不通的玩家会通过 Forward 进行转发 大量的连接对战 体育竞技游戏采用类似的结构 P2P 有网状模型 所有玩家互相连接 和 星状模型 所有玩家连接一个主玩家 复杂的游戏状态在网状模型下难以形成一致 因此星 状 P2P 模型经受住了历史的考验 除去游戏数据 支持语音的战网系统也会将所有人的语音数 据发送到做主的那个玩家机器上 通过混音去重再编码的方式返回给所有用户 战网类游戏 以竞技

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论