Files
dsh_shenxian/dsh-server-docs/04-调整方案/109-覆盖网络-调研-游戏网络特征与群聊上限.md
T
admin 4e3a1a4a13 docs(overlay): 覆盖网络/客户端化 10 份规划转正式档案 103-112 + 登记
- 新增 04-调整方案/103-112:可行性评估 · 全球架构复盘 · 骨干层方案 ·
  百台推演 v2 · 千台全场景推演 · 游戏专项 · 游戏网络与群聊上限调研 ·
  答疑(群聊/备份/迁移/保密) · 补遗与参考方案 · 九大瓶颈落地方案
- 每份按 交接单/README.md §二 8 段改写(目标/只读前置/范围/决策点/
  步骤/验收/回滚/回报格式)+ 头部状态标注(📋 规划态 · 未实施)
- 技术内容不变:附录 A 逐字保留原文全文(仅去其一级标题),已逐份校验字节一致
- 登记:INDEX.md §二 +10 行、03-路线图与待办.md §二 +1 行
- 收尾:docs-audit.py 退出码 0(无 P0)· docs-manifest.py 已刷新
- 本轮零代码、零服务器改动;⛔ 未 push
- 占号:103-112(先原子 mkdir .lock-<NN> 再写)
2026-09-16 10:25:09 +08:00

203 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 109 · 覆盖网络 · 调研-游戏网络特征与群聊上限
- 日期:2026-09-16 | 状态:📋 **规划态**(**全网调研稿**;数值均标注来源口径,未在本环境实测的一律标出)
- 来源:工作区根 `覆盖网络_调研_游戏网络特征与群聊上限_20260916.md`(正文见 附录 A)
- 层级:专项调研(**数值底座**)| 配套档案 **108**(游戏专项)· 104(全球架构复盘)
- 🟢 范围:只考虑技术实现;跨境数据合规由使用者自行考虑。
> **TL;DR**
> 两部分:① **这类游戏的网络特征**(传奇 / MMORPG / MUD 的每玩家带宽、同步间隔、承载、延迟/丢包门槛);
> ② **单房间群聊的人数上限** —— 🔑 关键结论:**上限不是「人数」而是「扇出预算」**,且 **presence(N²)比消息更早爆**(1000 人房 ≈16,700 次/秒)。
> 给我们场景特有的上限:**单房间实际上限由「presence + agent 预算」决定**,不是由消息扇出决定。
## 一、目标
为容量规划提供**可引用的数值底座**:游戏侧(每玩家 2–20 KB/s、jitter<20 ms 等)与群聊侧(产品上限对照、三种分发模型的爆炸点、分档建议)。
可判定「做完了没有」= 两部分数值齐备 + **每条标注是行业资料口径还是本环境实测** + 结论可换算到本方案。
## 二、只读前置
| # | 事实 | 核对方式(期望输出) |
|---|---|---|
| 1 | 本档全部游戏数值均为**行业资料口径**,非本环境实测 | 逐条对照 §1.1/§1.2/§1.3 的来源标注 |
| 2 | 本环境唯一相关实测 = 跨云 **~22 KB/s**(只能作下界) | 47↔106 实测(档案 110 §三) |
| 3 | 我们场景的 presence 量级可与 §2.2 公式对齐 | `1000 × 1000 / 60` ≈ **16,700 次/秒** |
| 4 | 平台现**无「房间」抽象** ⇒ 群聊属新增能力,不是开关 | 档案 110 §五 |
| 5 | 抖动门槛 **>20 ms 即 desync** 是选路的判据来源 | 本档 §1.2 与 §1.4 第 2 条 |
## 三、范围
- **改什么**:⏳ 无实施动作 —— 本档是**调研**,产出为数值与判据,供 104/107/108/112 引用。
- **不动什么**:⛔ 本轮不动服务器、不改代码、不改文档库其它文件。
- 🟢 边界:⛔ **不得把本档的行业口径数字当作本环境实测结论**(每条均已标注)。
## 四、决策点
**已定(本档给出的判据,已被后续档案采纳)**
1. **容量按「服」算,不按「玩家」算**(服务端权威 ⇒ 玩家之间不互联)⇒ 中继需求 = 服数 × 1~N。
2. **游戏侧要盯的是「抖动」不是「带宽」**(jitter > 20 ms 即 desync)⇒ 中继链路质量差(如跨云 22 KB/s)**延迟低也没用**。
3. **上行是主方向**(服务器 → 玩家)⇒ 规划时看服务器上行。
4. **单房间上限定义为「扇出预算」而不是人数** ⇒ 先定"单节点每秒可承受投递数",再反推人数上限(可随架构演进变大,而不是魔法数字)。
5. **混合模型**(小群扇出 / 大群拉取)—— Telegram 实际做法,服务端只维护**消息时序 + 版本游标**。
6. **presence 收敛 = 只订阅「当前可见成员列表」**(Slack 做法)⇒ 流量降 5 倍。
7. **压测必须用攻城场景**(数百人同屏、带宽翻倍、同步间隔收紧到 50–100 ms),不能用平峰。
**未定**:本环境能否满足 jitter<20 ms(**未实测,且这是游戏可玩性的决定项**)。
## 五、步骤
**本档无实施步骤**(调研稿)。其**结论已被下列档案转化为可执行步骤**:
- 游戏侧 → **档案 108 §五**(服主接入 → 房间层 → 存档备份 → 跨区路由 → 会话恢复 → 副本/合服)
- presence 与群聊上限 → **档案 112 §1**(presence 七条落地做法 + 大房特殊策略)
- 数值校准 → **档案 107 §六**(未验证项转为实测项)
## 六、验收
| # | 口径 | 期望 |
|---|---|---|
| A | 游戏数值可引用 | 传奇每人 0.5–20 KB/s;MMORPG 80–800 Kbps;MUD <1 KB/s —— 均标来源 |
| B | 群聊上限对照 | Telegram 200,000 | WhatsApp 2,048 | Discord 单频道 100K+ 在线 |
| C | 分档建议 | ≤100 / 100–2,000 / 2,000–50,000 / >50,000 四档,各有架构要求与判据 |
| D | 本方案特有上限 | 明确「presence + agent 预算」比消息扇出更早触顶 |
| E | 未验证项透明 | 第三部分五条已列全 |
## 七、回滚
- **本档自身**:零改动 ⇒ 无回滚需要。
- ⛔ **不得作为实测依据被引用**:本档数值是**行业资料口径**,任何"已经达标"的结论都必须另有本环境实测支撑。
## 八、回报格式
执行会话(或后续校准会话)回填:① 自建服实测的每玩家带宽与同步间隔(与 §1.1 对照)② 中继链路 jitter 分布 ③ 攻城战压测结果 ④ presence 收敛实际降幅(5× 是否可达)⑤ agent 放大系数实测 ⑥ 取数时间与命令。
## 九、未验证项(勿当结论)
上述游戏数值均为**行业资料口径**,非本环境实测(**需按自建服实测校准**)|中继链路能否满足 **jitter < 20 ms**(比带宽更关键,**未实测,且这是游戏可玩性的决定项**)|攻城战(数百人同屏)在本方案的压测结果(**未做**)|presence 在本方案下的实际收敛效果(5× 是否可达,**未实测**)|agent 参与的放大系数实测(**未实测**)。
---
## 附录 A · 原始规划正文(逐字保留 · 2026-09-16)
> 以下为工作区根 `覆盖网络_调研_游戏网络特征与群聊上限_20260916.md` 的**原文全文**,仅删除其一级标题(避免与档案标题重复),
> 其余**一字未改**;本档的可判定部分以上方 8 段为准。
> 日期:2026-09-16 | 性质:**全网调研稿**(数值均标注来源口径;未在本环境实测的一律标出)
> 配套:`覆盖网络_游戏专项_MMORPG与MUD_20260916.md`|`覆盖网络_全球架构复盘_20260916.md`
> 🟢 范围:只考虑技术实现;跨境数据合规由使用者自行考虑。
---
## 第一部分 · 这类游戏的网络特征
### 1.1 传奇类(中文运维资料口径,最具体)
| 参数 | 数值 |
|---|---|
| **每人带宽** | **文字聊天 0.5 KB/s | 普通战斗 2–5 KB/s | 攻城战 10–20 KB/s**;另一口径:单用户平均上行 **10–20 KB/s** |
| **带宽估算公式** | `所需带宽 = 玩家数 × 100 Kbps ÷ 8`;100 人 ≥ 2 Mbps | 500 人 ≥ 10 Mbps | 1000 人 ≥ 50 Mbps |
| **实战推荐带宽** | 50 人 5 Mbps | 200 人 10 Mbps | 500 人 20 Mbps+(均含冗余) |
| **同步间隔** | 常规 **100–200 ms(5–10 Hz)**;**攻城/大型团战 50–100 ms(10–20 Hz)** |
| **引擎帧数设置** | <100 人 20 帧 | ≤200 人 25–30 帧 | ≈300 人 35–40 帧 |
| **发送间隔 / 缓存** | 网络发送间隔 20–30 ms;发送缓存 4096 B;接收缓存 8192 B;最大接收 1024–2048 KB/s |
| **承载** | 单区常规 **1000–5000 人**(TCP 并发 2000–10000;TPS 500–2000) |
| **延迟 / 丢包** | 延迟 ≤ **50 ms**,丢包 < 1% |
| **内存经验值** | 每 50 名玩家 ≈ 1 GB(+20% 缓冲);1000 人区服建议 16 GB |
| **峰值场景** | **攻城战:数百玩家同屏**,带宽翻倍至 **80–100 Mbps**(1000 人口径),CPU/内存压力最大 |
### 1.2 MMORPG(英文资料口径,含 3D 参照)
| 参数 | 数值 |
|---|---|
| **每玩家带宽** | 同步 **10–20 Hz**;兴趣域实体 **50–100 个**;每实体 **20–50 B**;每包 **1–5 KB** ⇒ **单客户端 80–800 Kbps**(该上限是 3D 现代 MMO 口径;**2D/传奇类取低段**) |
| **500 人峰值** | **200–500 Mbps**;端口最低 **1 Gbps**,500+ 用 10 Gbps |
| **延迟门槛** | **< 100 ms**;⚠️ **抖动(jitter)> 20 ms 就会造成位置与战斗 desync** |
| 数据库 | MNORPG 是**持续写入**(每次拾取/战斗/交易都写)⇒ **DB I/O 是隐藏瓶颈**,>500 人建议数据库独立机器 |
| 优化 | **兴趣域(AOI)是控制带宽的"杀手锏"**;delta 压缩可再减 **50%+** |
### 1.3 MUD(文字)
- 纯文本行 ⇒ 每玩家 **< 1 KB/s**(与棋牌/回合制同档);瓶颈是**并发连接数**(内存与文件句柄),不是带宽。
- tick 0.25–1 s;**延迟容忍度最高**,跨洲也可玩。
### 1.4 对覆盖网络的五条推论(这一节才是我们要的)
1. **带宽量级很小**:这类游戏单玩家 **2–20 KB/s**,1000 人也就 **20–100 Mbps** —— **中继扛得住**,不像视频/大文件。
2. ⚠️ **真正要盯的是"抖动",不是"带宽"** —— 业界口径 **jitter > 20 ms 就会 desync**。⇒ 中继路径的价值不是省带宽,而是**抖动是否可控**;中继链路质量差(如实测那条 22 KB/s 的跨云)**延迟低也没用**。
3. **上行是主方向**(服务器 → 玩家),下行只是操作指令 ⇒ 规划时**看服务器上行**。
4. **容量按"服"算,不按"玩家"算**(服务端权威 ⇒ 玩家之间不互联)⇒ 中继需求 = 服数 × 1~N,而不是玩家数。
5. **攻城战就是压测基准**:数百人同屏、带宽翻倍、同步间隔收紧到 50–100 ms ⇒ **压测必须用攻城场景**,不能用平峰。
---
## 第二部分 · 单房间群聊的人数上限
### 2.1 产品上限对照(真实产品,可作为能力标尺)
| 产品 | 单房间上限 | 备注 |
|---|---|---|
| **Telegram 群组** | **200,000** 成员(频道无限) | 十万级群**切换为拉取模型**;慢速模式间隔 10 s–1 h |
| **WhatsApp 群** | **2,048** 成员 | fanout = 2047,典型"纯扇出"上限 |
| **Discord** | 单频道 **100K+ 在线**;单 guild **25M 成员**(2025-09) | 1M 并发/guild(72 台 ScyllaDB 存万亿消息) |
| 国内 IM | 数百 → 两千量级 | 口径随产品变化,此处不列精确值 |
### 2.2 为什么上限不是"人数"而是"扇出预算"
**三种模型与各自的爆炸点**:
| 模型 | 写放大 | 读放大 | 结论 |
|---|---|---|---|
| **纯扇出**(服务端逐人推送) | **极高**:20 万人群一条消息 = 20 万次写入 | 低 | **小群王道,大群自杀** |
| **纯拉取**(只存一份,各端按游标读) | 极轻 | **高**:20 万人同时上线打穿热点 | 实时性差,需长连接通知配合 |
| **混合(Telegram 实际做法)** | 小群扇出 / 大群拉取 | 中 | **推荐**:服务端只维护**消息时序 + 版本游标**,客户端按游标增量拉 |
**两个必须算的放大点(附实际数字)**:
1. **消息扇出**:20 万人 × 500 条/分钟 = **1 亿次推送/分钟** ⇒ 纯扇出不可能。
Discord 口径:单频道 **30K 在线 × 10 msg/s = 30 万次"权限校验后的投递"/秒** —— 注意**权限检查(RBAC)是 CPU 热路径**。
2. **在线状态(presence)是 N² 问题**:每人订阅所有可见成员的状态,每次变化扇出给所有订阅者。
⚠️ **算一下就发现它比消息更早爆**:1000 人房、每人每分钟变化一次 ⇒ `1000 × 1000 / 60` = **≈16,700 次/秒** —— **千人房就已经是热点**。
✅ 业界解法(Slack):**只订阅"当前可见成员列表"** ⇒ presence 流量降 **5 倍**。
### 2.3 关键工程机制(可直接照抄)
| 机制 | 作用 |
|---|---|
| **pub/sub 聚合** | 一条消息**每个 relay/gateway 节点只推一次**,而不是每个接收者一次 —— 这是把 30,000 次推送降下来的关键 |
| **版本游标 + 增量拉取** | 客户端只拉游标之后的增量;翻历史才回溯 |
| **presence 收敛** | 订阅范围裁剪(只可见者)+ 批量合并 + 降频 + 最终一致 |
| **RBAC 缓存 + 版本化失效** | 权限检查在热路径 ⇒ 必须缓存,且要能失效 |
| **慢速模式(slow mode)** | 把限流产品化(大群必备) |
| **客户端侧** | 本地 SQLite 缓存、成员**懒加载**、消息合并/分片渲染(防界面卡死)、多设备靠 sequence 对齐 |
| **三平面分离** | 连接平面(gateway)/ 协调平面(房间进程)/ 存储平面(写重型库 + 搜索)各自独立扩展 |
| **一致性取舍** | **最终一致(1–2 s 窗口可接受)+ 房间内严格有序** |
### 2.4 给我们的**分档建议**(回答"单房间上限")
| 房间规模 | 架构要求 | 判据 |
|---|---|---|
| **≤ 100 人** | 纯扇出即可 | 无压力 |
| **100 – 2,000 人** | **纯扇出可行**,但必须:presence 合并 + 消息限频 + 权限缓存 | 千人房的 presence 已是热点(≈1.6 万次/秒) |
| **2,000 – 50,000 人** | **必须混合**:pub/sub 聚合 + 游标拉取 + presence 只推可见者 + 慢速模式 | 扇出成本随人数线性,聚合后按节点数而非人数 |
| **> 50,000 人** | **只能拉取模式**,公告/只读为主,presence 大幅弱化 | Telegram 20 万即此档 |
> **建议把上限定义为"扇出预算"而不是人数**:先定"单节点每秒可承受的投递数",再由它反推房间人数上限 —— 这样上限可以随架构演进(加 gateway)而变大,而不是一个魔法数字。
### 2.5 我们场景特有的上限(**比技术扇出更早触顶**)
- **agent 入群后,真正的放大点不是消息,而是"agent 之间的互相激发"**:
一个房间若有 K 个 agent,且不加约束 ⇒ 消息量可指数增长。
- ⇒ 必须按 **`agent 数 × 触发频率`** 单独设预算(每 agent 每 N 分钟最多 M 条 + 静默期 + **禁止 agent 直接触发 agent**)。
- ⇒ 结论:**对我们而言,单房间的实际上限由"presence + agent 预算"决定,而不是由消息扇出决定** —— 后者在千人量级还远远不是瓶颈。
---
## 第三部分 · 未验证项(勿当结论)
| # | 项 | 状态 |
|---|---|---|
| 1 | 上述游戏数值均为**行业资料口径**,非本环境实测 | ⚠️ 需按自建服实测校准 |
| 2 | 中继链路能否满足 **jitter < 20 ms**(比带宽更关键) | ⚠️ **未实测,且这是游戏可玩性的决定项** |
| 3 | 攻城战(数百人同屏)在本方案的压测结果 | ⚠️ 未做 |
| 4 | presence 在本方案下的实际收敛效果(5× 是否可达) | ⚠️ 未实测 |
| 5 | agent 参与的放大系数实测 | ⚠️ 未实测 |