SNS 游 戏 的 可 扩 展 体 系 结 构 和 最 佳 应 用 介 绍 社 交 网 络 游 戏 是 当 今 最 热 门 的 在 线 游 戏 投 资 领 域, 具 有 炙 手 可 热 的 增 长 许 多 Facebook 上 的 社 交 网 络 游 戏 每 天 吸 引 着 数 以 百 万 或 千 万 的 用 户, 并 且 收 入 有 几 十 或 数 百 亿 美 元 所 以 现 在 每 个 人 都 急 于 建 立 未 来 的 HappyFarm 或 Farmville 虽 然 这 些 游 戏 相 对 容 易 建 立, 但 却 不 那 么 容 易 扩 大 规 模 这 个 问 题 可 以 通 过 投 入 大 量 的 资 金 和 人 力 物 力 来 解 决, 但 小 型 的 游 戏 公 司 通 常 没 有 这 样 的 能 力, 也 没 有 必 要 这 么 做 本 指 南 主 要 是 介 绍 如 何 从 零 开 始 构 建 一 个 结 构 优 良, 容 易 扩 展 的 游 戏, 并 确 保 可 以 平 滑, 低 成 本 的 快 速 扩 展 到 更 大 规 模 本 指 南 主 要 关 注 基 于 flash 的, 在 Linux 上 运 行 的 PHP / MySQL 系 统, 但 也 适 用 于 大 多 数 大 型 网 站 和 系 统 这 些 系 统 大 多 是 单 用 户 的, 不 过 也 有 向 小 型 实 时 多 用 户 系 统 发 展 的 趋 势, 当 然 这 样 的 系 统 搭 建 和 扩 展 更 加 复 杂 Flash 几 乎 所 有 的 SNS 游 戏 都 使 用 Flash 客 户 端 来 提 供 游 戏 内 容, 通 过 该 客 户 端 实 时 地 从 后 端 系 统 加 载 图 像, 声 音 等 元 素 整 体 vs 模 块 化 - 许 多 新 游 戏 都 采 用 了 一 整 块 大 的 Flash 文 件, 大 小 在 5 到 50MB 之 间, 需 要 很 长 时 间 下 载 由 于 这 个 文 件 通 常 包 含 所 有 的 游 戏 内 容 ( 例 如 图 片 等 ), 虽 然 容 易 搭 建, 但 用 户 体 验 却 非 常 不 好 如 果 游 戏 当 中 有 什 么 变 化, 整 个 文 件 必 须 再 重 新 下 载 运 行 游 戏 前, 在 一 个 1Mbps 的 DSL 线 路 上 传 输 10MB 的 文 件, 至 少 需 要 100 秒, 或 大 约 2 分 钟 的 时 间 最 佳 做 法 : 把 游 戏 分 解 成 较 小 的 独 立 动 态 加 载 模 块 在 许 多 情 况 下, 游 戏 将 使 用 一 个 非 常 小 的 启 动 页 面 ( 启 动 屏 幕 ), 使 用 户 感 觉 到 他 们 开 始 运 行 了, 然 后 下 载 基 本 组 件 动 态 内 容 - 在 游 戏 中 的 许 多 内 容, 如 图 像, 声 音 等, 可 以 动 态 加 载 或 根 据 Flash 客 户 端 需 要 下 载 这 些 动 态 内 容 通 常 是 从 后 台 的 CDN 下 载, 这 样 Flash 文 件 要 小 得 多 并 且 许 多 这 类 内 容 不 会 经 常 变 化, 因 此 可 以 在 客 户 端 重 复 使 用
最 佳 做 法 : 在 需 要 时 或 需 要 前 从 CDN 下 载 内 容, 并 使 它 们 与 Flash 代 码 和 文 件 分 离 存 盘 率 vs 响 应 速 度 当 用 户 玩 游 戏 时, 客 户 端 可 以 把 每 一 个 变 化 实 时 写 到 后 端 Web 服 务 器, 也 可 以 储 存 一 些 变 化, 每 隔 几 分 钟 或 者 根 据 请 求 在 后 端 进 行 数 据 写 入 其 实 这 是 数 据 安 全 和 游 戏 响 应 速 度 的 一 种 平 衡 : 因 为 保 存 每 一 个 变 化 都 会 让 用 户 等 待, 对 web/ 数 据 库 服 务 器 也 是 很 大 的 负 担 ; 但 是 如 果 游 戏 过 程 中 很 少 保 存, 一 旦 计 算 机 / 浏 览 器 崩 溃 或 互 联 网 连 接 丢 失 或 不 稳 定, 数 据 就 会 丢 失 最 佳 做 法 : 保 存 变 化, 每 几 分 钟 或 者 根 据 需 要 把 它 们 写 到 web 服 务 器 上 这 样 既 保 障 了 数 据 的 安 全, 也 减 少 了 对 / 数 据 库 服 务 器 的 网 络 负 载 请 注 意 :Web 服 务 器 可 能 并 不 总 是 保 存 数 据 到 数 据 库, 有 时 候 只 是 存 储 在 Memcache, 定 期 保 存 到 数 据 库 或 使 用 cron 系 统 把 数 据 变 化 应 用 到 数 据 库 ( 解 决 一 些 PHP 的 问 题 ) CDN CDNs 经 常 被 用 来 存 储 游 戏 的 Flash 文 件 和 游 戏 内 容 它 通 过 提 高 下 载 性 能 和 降 低 游 戏 服 务 器 上 的 负 载 / 带 宽 提 高 了 用 户 体 验 CSN 一 个 很 大 的 问 题 是 版 本 控 制 和 命 名, 因 为 CDN ( 和 浏 览 器 ) 将 永 久 缓 存 / 存 储 这 些 文 件, 这 样 很 难 在 以 后 更 新 flash - 最 佳 做 法 是 把 所 有 的 Flash 文 件 都 放 在 CDN 上, 不 同 的 版 本 使 用 不 同 的 名 字, 如 my_game_20100301.1.flv 内 容 - 最 佳 做 法 是 把 所 有 的 游 戏 内 容 放 在 CDN 上, 一 个 特 定 资 产 的 不 同 版 本 用 不 同 的 名 字 所 以 如 果 一 个 建 筑 图 片 需 要 改 变, 它 应 该 使 用 一 个 不 同 的 名 称 和 版 本 号, 如 cool_building_43.1.jpg 格 式 命 名 - 由 于 文 件 名 总 是 在 变, 必 须 有 一 种 方 法 能 让 客 户 端 知 道 该 如 何 检 索 最 佳 做 法 是 使 用 没 有 缓 存 的 XML( 或 二 进 制 / 压 缩 ) 文 件 每 一 次 用 户 登 录 或 游 戏 开 始 时, 它 都 下 载 并 包 含 一 份 所 有 目 前 最 新 的 flash 文 件 和 资 产 列 表 客 户 端 可 以 使 用 此 列 表 来 获 得 它 所 需 要 的 新 文 件 负 载 均 衡 当 游 戏 需 要 扩 容, 单 一 的 Web 服 务 器 将 不 能 快 速 的 处 理 所 有 的 流 量 而 且 如 果 只 有 一 个 服 务 器, 它 的 崩 溃 会 使 得 整 个 游 戏 停 止 基 于 以 上 原 因, 即 使 是 小 游 戏 往 往 也 会 有 两 台 以 上 的 Web 服 务 器, 通 过 负 载 均 衡 进 行 管 理 请 注 意, 这 意 味 着 每 一 个 后 端 HTTP 请 求 可 能 被 引 到 不 同 的 Web 服 务 器, 进 行 会 话 管 理, 以 下 是 详 细 说 明 最 佳 做 法 : 使 用 一 个 故 障 转 移 模 式 下 的 LVS 的 简 单 系 统 因 为 通 常 情 况 下 很 少 有 数 据 缓 存, 所 以 没 有 必 要 使 用 PERLBal 或 其 它 的 缓 存 平 衡 器 会 话 SNS 系 统 需 要 一 种 方 法 来 管 理 用 户 的 安 全 和 会 话, 可 以 使 用 和 普 通 网 站 相 同 的 技 术, 即 一 个 登 录 过 程 和 一 个 会 话 Cookie NetCloud SNS Game ArchitectureCN20100421.1.pdf.doc 2/6
最 佳 做 法 : 通 过 SSL 连 接 进 行 用 户 身 份 验 证, 把 会 话 数 据 写 入 到 Memcache, 并 发 给 它 们 一 个 含 有 会 话 ID 并 安 全 加 密 的 会 话 cookie 此 ID 根 据 需 要 可 以 被 任 何 PHPweb 服 务 器 用 来 检 索 会 话 数 据 游 戏 从 来 都 不 应 绑 定 到 或 始 终 使 用 同 一 Web 服 务 器 Web 层 SNS 系 统 中 的 Web 服 务 器 通 常 只 是 一 个 用 于 处 理 游 戏 数 据 的 存 储 API, 加 上 一 些 例 如 安 全, 朋 友 列 表, 聊 天, 排 行 榜, 购 买 / 结 算 等 功 能 的 逻 辑 操 作 这 些 Web 服 务 器 往 往 没 有 用 户 界 面, 而 利 用 Flash 客 户 端 做 任 何 事 情, 尽 管 有 些 集 成 了 网 站 Web 服 务 器 连 接 - 即 使 在 理 论 上,Flash 客 户 端 可 以 断 开 和 重 新 连 接,SNS 游 戏 网 站 比 普 通 的 网 站 连 接 时 间 更 长 最 佳 做 法 : 当 Flash 客 户 端 遇 到 失 败 的 连 接 时 并 根 据 需 要 自 动 重 新 连 接 如 果 可 能, 客 户 端 也 应 该 对 连 接 质 量 和 其 他 细 节 进 行 统 计, 并 定 期 报 告 API 列 表 - 从 Flash 客 户 端 到 PHP 后 端 服 务 器 的 HTTP 请 求 应 该 被 认 为 是 一 个 API, 该 API 应 该 具 有 详 细 记 录 全 面 规 划 的 调 用 接 口, 包 含 参 数, 可 选 参 数, 安 全 等 最 佳 做 法 : 把 所 有 这 些 API 调 用 记 录 在 电 子 表 格 中, 并 确 保 它 们 一 致, 具 备 清 楚 的 名 字, 同 样 的 参 数 名 和 类 型, 等 等, 然 后 可 用 这 些 调 用 建 立 测 试 系 统, 用 HTTP 工 具 进 行 验 证 和 测 试 对 API 调 用 建 模 并 且 测 试 - 一 旦 API 调 用 被 记 录 下 来, 便 可 以 建 立 模 型, 来 确 定 调 用 的 好 坏, 以 及 在 每 个 方 向 上 用 来 模 拟 带 宽 和 数 据 库 规 模 的 数 据 流 量 有 多 少 最 佳 做 法 : 列 出 每 个 API 被 调 用 的 次 数, 以 及 每 个 用 户 调 用 的 频 率, 每 个 方 向 多 少 数 据 ( 最 小, 最 大, 平 均 值 ) 这 些 可 以 用 来 建 立 测 试 系 统, 使 用 HTTP 工 具 进 行 负 载 测 试, 也 可 以 用 来 对 数 据 库 服 务 器 负 载 进 行 建 模 XML vs 压 缩 / 二 进 制 - 许 多 简 单 的 游 戏 使 用 普 通 的 XML 在 Flash 和 PHP 之 间 传 输 数 据, 但 这 样 很 慢, 并 且 占 用 大 量 的 内 存 以 及 使 用 了 大 量 的 带 宽 最 佳 做 法 : 压 缩 任 何 XML, 并 尝 试 使 用 二 进 制 数 据 传 输 来 减 少 数 据 量 数 据 缓 存 层 游 戏 和 网 站 扩 展 中 一 个 非 常 重 要 的 部 分 是 高 性 能 数 据 缓 存, 通 常 使 用 Memcached 这 使 得 数 据 库 服 务 器 可 以 延 展 以 适 应 大 型 系 统, 对 游 戏 来 说, 可 以 控 制 数 据 变 化 被 写 入 数 据 库 的 频 率 请 注 意, 对 于 PHP 后 端, 如 果 客 户 端 连 接 丢 失, PHP 里 无 法 把 缓 存 的 数 据 扫 到 数 据 库, 除 非 使 用 了 像 cron 这 样 单 独 的 过 程 和 相 关 的 数 据 结 构 来 追 踪 需 要 更 新 的 内 容 最 佳 做 法 : 使 用 至 少 两 台 Memcached 服 务 器, 可 以 部 署 在 单 独 的 云 服 务 器 或 其 它 有 足 够 内 存 的 服 务 器 上, 如 数 据 库 服 务 器 可 选 做 法 : 使 用 一 个 cron 作 业, 在 到 期 前 或 从 缓 存 释 放 之 前 修 改 被 挂 起 的 数 据 并 且 将 其 应 用 到 数 据 库 NetCloud SNS Game ArchitectureCN20100421.1.pdf.doc 3/6
数 据 库 层 SNS 游 戏 一 个 典 型 的 扩 容 瓶 颈 是 数 据 库 有 很 多 方 法 可 以 推 迟 或 避 免 此 问 题 出 现, 可 以 从 良 好 的 构 架, 设 计, 和 提 早 注 意 入 手 良 好 的 数 据 库 设 计 - SNS 游 戏 的 数 据 库 通 常 很 简 单, 所 以 他 们 可 以 使 用 简 单 的 外 键 和 索 引 但 由 于 数 据 现 在 或 以 后 往 往 会 被 分 割, 所 以 需 要 认 真 注 意, 确 保 数 据 正 确 分 割, 而 没 有 太 多 的 数 据 依 赖 关 联 最 佳 做 法 : 设 计 一 个 对 直 接 数 据 依 赖 ( 如 联 接 ) 相 当 有 限 的 简 单 数 据 库, 并 经 DBA 和 数 据 库 专 家 审 查 良 好 的 SQL 查 询 - 提 高 整 体 系 统 性 能 最 重 要 的 方 式 通 常 是 提 高 SQL 的 质 量 许 多 游 戏 刚 开 始 只 有 非 常 简 单 的 查 询, 但 到 后 来 会 变 得 非 常 复 杂, 导 致 性 能 迅 速 下 降 有 时 候 甚 至 几 个 同 时 查 询 就 可 以 造 成 服 务 器 宕 机 最 佳 做 法 : 不 断 检 查 并 解 释 所 有 查 询 代 码, 以 及 带 来 的 大 型 数 据 库 的 性 能 最 佳 做 法 : 不 断 监 测 MySQL 的 慢 查 询 日 志, 特 别 是 那 些 检 测 大 量 行, 但 返 回 很 少 数 据 的 日 志 对 于 找 到 的 每 一 个 问 题, 都 应 该 仔 细 研 究 和 改 进 读 / 写 分 离 许 多 大 型 网 站 通 过 在 PHP 端 分 离 SQL 查 询 的 读 和 写, 并 且 在 不 同 的 数 据 库 运 行 以 提 高 运 行 性 能 对 于 读 取 占 很 大 比 例 的 系 统 尤 其 如 此 但 SNS 游 戏 的 读 写 往 往 会 更 平 衡, 一 般 是 50% 的 读 取 和 50% 的 写 入, 这 种 情 况 下 读 写 分 离 带 来 的 性 能 提 升 就 不 大 了 但 是 可 以 把 写 入 捆 绑 在 一 起 使 用 批 量 更 新, 这 样 读 写 比 例 就 能 提 高, 以 上 的 办 法 就 会 起 到 很 好 的 效 果 最 佳 做 法 : 评 价 读 / 写 比 例, 如 果 超 过 60-70% 读 取, 就 可 以 分 离 PHP 连 接 通 常 最 好 是 在 开 始 时 分 离, 并 使 两 个 连 接 同 时 指 向 同 一 个 数 据, 这 样 以 后 如 果 需 要 指 向 不 同 的 数 据 库 也 会 相 对 容 易 更 改 功 能 分 区 - 大 型 游 戏 系 统 通 常 把 数 据 分 割 或 分 区 到 不 同 的 数 据 库, 之 后 再 分 到 不 同 的 数 据 库 服 务 器 上 这 样 提 高 了 灵 活 性, 并 可 对 独 立 的 组 件 按 需 扩 展 这 通 常 也 比 数 据 共 享 容 易 得 多, 前 提 是 在 不 同 的 数 据 库 之 间 没 有 很 强 的 数 据 依 赖 例 如, 不 要 跨 越 数 据 库 和 功 能 进 行 连 接, 从 一 开 始 就 使 用 单 独 的 查 询 语 言 登 录 / 用 户 大 多 数 系 统 在 一 开 始 就 分 离 用 户 登 录 / 安 全 数 据 库 最 佳 做 法 : 对 用 户 和 登 录 采 用 分 离 的 数 据 库 ( 使 用 salted hash 密 码, 而 绝 不 要 使 用 明 文 或 加 密 的 文 本 存 放 密 码 ) 这 适 用 于 非 常 大 的 用 户 数 据 库 ( 几 千 万 ), 同 时 还 可 以 作 为 用 户 数 据 共 享 的 目 录 需 要 注 意 的 是, 实 际 的 用 户 数 据 博 客 或 历 史 等 往 往 无 需 存 储 在 此 数 据 库 中 游 戏 数 据 或 状 态 实 际 游 戏 数 据 通 常 由 用 户 存 储 在 一 个 单 独 的 数 据 库 里, 这 可 能 包 括 他 们 目 前 的 游 戏 状 态, 输 赢, 得 分 等 这 个 单 独 数 据 库 是 系 统 里 的 高 频 读 / 写 数 据 库 最 佳 做 法 : 使 用 一 个 或 多 个 游 戏 资 料 数 据 库, 以 用 户 ID 与 系 统 的 其 余 部 分 进 行 连 接 NetCloud SNS Game ArchitectureCN20100421.1.pdf.doc 4/6
博 客 / 聊 天, 其 他 高 容 量 的 数 据, 如 博 客 聊 天 等 通 讯 工 具 产 生 的 数 据, 可 以 存 储 在 专 门 用 于 这 些 功 能 的 数 据 库 而 许 多 其 他 功 能, 如 排 行 榜 事 件 统 计 以 及 友 情 链 接 等, 可 以 放 在 另 外 的 数 据 库 里 最 佳 做 法 : 对 诸 如 博 客, 聊 天 等 高 容 量 或 独 立 的 数 据, 使 用 单 独 的 数 据 库, 用 用 户 ID 与 系 统 的 其 余 部 分 进 行 连 接 碎 片 - 非 常 大 的 游 戏 数 据 通 常 会 根 据 用 户 而 被 分 开 ( 分 区 ) 到 单 独 服 务 器 上 或 者 单 独 的 数 据 库 中 因 此, 用 户 1 的 数 据 可 能 在 服 务 器 3 上, 用 户 2 的 数 据 可 能 在 服 务 器 5 上 这 看 上 去 更 复 杂, 但 非 常 有 利 于 升 级 必 须 注 意 到, 这 些 分 散 的 数 据 很 难 进 行 聚 集, 连 接 或 搜 索 操 作, 因 此 要 对 其 精 心 设 计, 尤 其 是 对 于 多 用 户 或 朋 友 关 联 的 系 统 来 说 请 注 意, 当 一 个 系 统 初 建 时, 所 有 的 数 据 库 可 能 会 在 同 一 个 服 务 器, 但 之 后 可 以 很 容 易 地 在 编 码 不 变 的 情 况 下 迁 移 最 佳 做 法 : 设 置 一 个 哈 希 表 或 以 目 录 为 基 础 的 ( 使 用 用 户 / 登 录 DB) 的 碎 片 系 统, 把 诸 如 游 戏 数 据 等 最 易 扩 容 的 数 据 放 在 单 独 的 数 据 库, 之 后 可 以 放 在 单 独 的 服 务 器 上 最 佳 做 法 对 于 多 用 户 操 作 或 朋 友 名 单 来 说, 最 佳 方 案 取 决 于 特 定 游 戏 的 设 计 和 使 用 如 果 朋 友 / 多 用 户 列 表 很 小, 分 离 查 询 就 可 以 了 对 于 较 大 的 系 统, 之 间 的 网 络 系 统 可 能 是 必 要 的 最 佳 做 法 对 于 聚 合, 搜 索, 或 数 据 仓 库 / 分 析 来 讲, 是 找 到 一 个 数 据 库 或 一 种 把 所 有 数 据 合 并 到 一 起 的 方 式 测 试 像 任 何 系 统 一 样, 精 心 策 划 和 执 行 的 测 试 有 助 于 提 高 系 统 性 能 并 使 之 更 快 地 向 用 户 发 布 为 扩 大 规 模, 用 实 际 大 小 的 数 据 做 负 载 测 试 以 发 现 瓶 颈 和 其 它 问 题 非 常 重 要 功 能 定 期 的 不 同 功 能 测 试 可 以 手 工 完 成, 但 自 动 测 试 也 非 常 必 要 最 佳 做 法 : 用 HTTP 的 测 试 工 具 为 定 期 自 动 系 统 覆 盖 做 回 归 测 试 由 于 服 务 器 端 没 有 用 户 界 面, 所 有 操 作 都 可 以 完 全 自 动 化 并 覆 盖, 当 然 对 Flash 客 户 端 来 说, 额 外 的 手 工 或 工 具 测 试 也 非 常 有 必 要 性 能 - 如 果 可 以 进 行 自 动 化 功 能 测 试, 可 用 于 做 大 面 积 性 能 测 试 否 则, 应 执 行 简 化 的 自 动 性 能 测 试 以 加 载 系 统 最 佳 做 法 : 使 用 一 些 自 动 化 HTTP 测 试 工 具 执 行 API 组 合 以 加 载 服 务 器, 同 时 使 用 一 个 包 含 延 迟, 断 开 连 接, 和 其 他 效 果 真 正 的 网 络 API 调 用 应 遵 循 API 列 表 和 模 型, 从 而 他 们 可 以 是 现 实 情 况 的 合 理 比 照, 不 只 是 登 录 / 注 销, 还 包 含 登 录, 加 载 朋 友, 玩 10 轮, 崩 溃, 再 玩, 登 出, 等 等 其 他 为 了 适 当 的 游 戏 运 营 和 扩 容, 游 戏 开 发 商 还 应 该 考 虑 到 一 些 其 他 方 面 这 些 都 会 极 大 程 度 地 帮 助 游 戏 运 营 商 和 开 发 商 管 理, 调 试 和 扩 容 系 统 NetCloud SNS Game ArchitectureCN20100421.1.pdf.doc 5/6
日 志 - 无 论 在 客 户 端 还 是 服 务 器 方 面, 新 系 统 的 系 统 日 志 是 非 常 重 要 的 最 佳 做 法 : 在 客 户 端 做 内 部 日 志, 并 定 期 把 日 志 发 送 给 服 务 器 以 作 存 储 或 日 后 分 析 特 别 是 如 果 有 错 误 或 其 他 问 题 最 佳 做 法 :PHP 服 务 器 记 录 重 要 活 动, 并 且 用 Debug 模 式 来 记 录 像 API 调 用 参 数 等 详 细 数 据 这 些 日 志 可 以 使 用 系 统 日 志 API 记 录 在 数 据 库, 文 件 系 统 或 系 统 日 志 上 客 户 端 的 统 计 方 法 flash 客 户 端 具 有 非 常 有 价 值 的 系 统 和 游 戏 信 息, 统 计 和 使 用 数 据, 开 发 商 和 游 戏 大 师 应 该 分 析 这 些 数 据 以 完 善 游 戏 这 些 信 息 包 括 玩 家 采 取 的 具 体 步 骤, 他 们 做 了 什 么, 玩 游 戏 的 时 间 等 等 最 佳 做 法 : 客 户 收 集 一 系 列 统 计 资 料, 并 定 期 发 送 他 们 到 服 务 器 以 作 存 储 和 日 后 分 析 可 以 让 所 有 客 户 端 做 此 动 作, 或 随 机 的 选 取 一 部 分 客 户 端 做 此 动 作 上 述 论 述 很 长, 包 含 很 多 最 佳 做 法, 但 其 中 大 部 分 都 相 当 简 单, 在 开 始 一 个 新 游 戏 时 也 易 于 实 现 但 是 之 后 会 变 得 越 来 越 难, 特 别 是 在 一 个 游 戏 已 经 在 规 模 和 稳 定 性 上 出 了 问 题 时 按 照 这 些 建 议 将 有 助 于 确 保 顺 利 开 始, 扩 大, 并 长 期 运 行 一 个 成 功 的 SNS 游 戏 NetCloud SNS Game ArchitectureCN20100421.1.pdf.doc 6/6