《MMO 服务器开发》网络与并发内核 目录

《MMO 服务器开发》卷一《网络与并发内核》全书导航页:说明本卷定位、读者画像与前置知识、学习节奏与三条阅读路径,交代贯穿游戏《晨曦大陆》与从零服务端 aegis,讲清 Go 主线加 Java 对照的双栈口径与 L1–L4 可运行性分级,并按六个部分列出 18 章 54 节的完整章节索引,另含序、前言、附录 A–D 与常见问题速查表,方便读者按需定位、跳读与随时查阅。

目录

欢迎来到《MMO 服务器开发》。这一卷要陪你做一件很实在的事:用 Go 从零写一个 MMO 服务端的网络与并发内核 aegis,写到它能让多个客户端连上、互相看见、并把每一步的耗时与吞吐量出来。

为什么是「网络与并发内核」而不是「整个服务端」?因为 MMO 服务端里最难、最容易出事、也最不容易被讲清楚的部分,恰恰不是玩法逻辑,而是那层看不见的底座——连接怎么接、包怎么切、消息怎么路由、定时器怎么组织、并发怎么写才不出竞态、状态怎么同步才不飘、客户端说的话凭什么信。玩法是长在这层底座上的。底座歪了,玩法写得再漂亮也会在三千人在线时塌掉。

市面上讲游戏服务端的文章不少,但大多是架构方案与选型讨论——画一张分层图,说一遍「网关要无状态、逻辑要分服、数据要分库」,然后就没有了。本卷走另一条路:每一节都写代码,每一节的代码都在本机真跑过,跑出来的数字就是这一节的结论。

这一卷写给谁

读者现状读完能拿到什么
有后端经验、想转游戏服务端熟 HTTP 与微服务,但没做过长连接一套从零写出的网络底座,和长连接与无状态后端的差异认知
已经在做游戏服务端会用框架,但不知道框架里怎么转协议、KCP、时间轮、Actor、同步模型的第一手实现经验
独立开发者 / 小团队想做多人游戏,被「同步怎么做」卡住一条可复制的路径:先能连上,再能同步,最后能压测
对 Go 并发感兴趣会写 goroutine,但没在真实网络服务里用过网络 I/O、调度器、背压、幂等这些只在真实负载下才暴露的问题

前置知识:会写 Go(或任何一门静态类型语言),了解 TCP 与 HTTP 的基本概念;不需要图形学基础,不需要装任何游戏引擎,不需要 Unity 或 Unreal。本卷全部代码在 Go 1.26 下直接运行,Java 对照部分经 Docker 拉取的 JDK 21 运行。

四类读者,四种收获

如果你有后端经验、想转游戏服务端。 你熟悉的是「请求进来、查库、返回、连接关掉」——无状态、短连接、可以随便水平扩容。MMO 服务端几乎是它的反面:连接是长活的、每个连接背后挂着一个有状态的玩家、消息可能每秒来几十条、玩家掉线了你还得替他把状态留住。这一卷从第 1 章就把这个差别讲透,后面每一章都在补这块认知的缺口。读完你会知道为什么「加一台机器」在游戏服务端里不是一句 kubectl scale 能解决的事。

如果你已经在做游戏服务端。 你可能用过 skynet、pitaya、Pomelo 或者公司自研的框架,会写业务逻辑,但遇到「包为什么丢了」「延迟为什么抖」「这个定时器为什么不准」时只能靠猜。这一卷把这些零件从框架里拆出来,一个一个从零写一遍:帧怎么切、KCP 怎么重传、时间轮怎么级联、邮箱怎么背压。拆过一遍,再看框架就看得懂它在替你做什么决定。

如果你是独立开发者或小团队。 你缺的往往不是热情,而是「先做哪一块」的次序感。这一卷的 18 章本身就是一份施工顺序表:先立协议,再做编解码与传输,然后连接、路由、定时,接着并发模型与正确性,最后实时同步与安全,第 17 章全部装起来。每一章都能独立跑通,你可以在任何一步停下,把它接到自己的项目里。

如果你对 Go 并发感兴趣。 你写过 goroutine 和 channel,但没在「两万条长连接同时活着、每秒钟几万条消息在流动」的场景里用过。这一卷会给你真实的负载:两万连接的建立成本、消息扇出的分配压力、邮箱积压时的背压策略、至少一次投递下的幂等设计。这些问题是 go test -race 和本地小 demo 永远暴露不出来的。

这一卷的技术选型

主干用 Go。 理由很直接:goroutine-per-connection 的写法让网络代码读起来像同步代码,标准库自带 net、encoding/binary、crypto/*,从零写协议栈不需要引入任何第三方库,读者能看见每一行在做什么。

另设约十个「双栈对照」小节,用 Java 21 做对照。 这不是为了凑字数,而是因为工业界真正在用的游戏服务端,Go 与 Java 各占半壁:Go 侧有 pitaya、leaf,Java 侧有 Netty 生态。对照的落点都是真实分歧点——并发模型(goroutine vs 虚拟线程)、内存视图(切片 vs ByteBuf)、序列化、RPC、GC 行为——每一处都给出可判定的选型结论,而不是语法对照。

Java 代码怎么跑。 本机只装了 Java 8,没有虚拟线程也没有现代 GC,所以本卷所有 Java 代码都经 Docker 拉取的 JDK 21 真跑,命令写在正文里,你可以原样复现。

可运行性口径

本卷把每个代码块标上一个层级,含义如下。

层级含义验收方式
L1纯逻辑,不依赖外部进程go test 直接跑绿
L2真起进程或真连端口自写 harness 做端到端断言
L2JJava 对照实现经 Docker 拉取的 JDK 21 真跑
L3仅静态(清单、配置)只做语法与结构校验,正文会说明
L4不可复现(公网、真机、DDoS)正文显式标注「需真实环境,命令行不可复现」
B基准产出数字,软告警不硬失败

基准三条纪律:进程隔离、预热到稳定、工作集超过缓存。所有数字都注明「同机相对量级,绝对数值不可移植」。

三条阅读路径

本卷 18 章 54 节,一次读完大约 6 周(每天一小时)。但不是每个人都该按同一种顺序读。

路径 A:顺序通读(约 6 周)

最完整的一条。按顺序走完 18 章,每章的代码都亲手敲一遍。

第 1–3 章(认识与地基)→ 第 4–6 章(编解码与传输)
→ 第 7–9 章(连接、路由与定时)→ 第 10–11 章(并发模型与正确性)
→ 第 12–14 章(实时同步)→ 第 15–18 章(权威、安全与综合)

适合谁:想真正吃透 MMO 服务端机制、或准备自研服务端的读者。第 17 章会把前 16 章的零件拼成一个能跑的服务端,不要跳过。

路径 B:直奔同步与网络(约 3 周)

已经懂网络编程、只想看 MMO 最核心的两块的话:

3.2 → 5.2 → 5.3 → 12.1 → 12.2 → 12.3 → 13.1 → 13.2 → 13.3 → 14.1 → 14.2 → 17.3

适合谁:有后端基础、目标是「把多人同步做出来」的读者。这条路径跳过了 I/O 模型与编解码基础,直接进入协议、可靠 UDP、同步模型与压测。

路径 C:只关心正确性与安全(约 2 周)

10.1 → 10.2 → 11.1 → 11.2 → 11.3 → 15.1 → 15.2 → 15.3 → 16.1 → 16.2 → 16.3

适合谁:已经在做服务端、被重复发奖、刷物品、瞬移外挂这些问题折磨过的读者。

全书章节索引

前置

篇目核心内容
目录本页:定位、读者、路径与可运行性口径
序为什么还要从零写一个 MMO 服务端
前言技术选型、Go 与 Java 双栈口径与环境准备

第一部分:认识与地基(第 1–3 章)

节文章
1.1分层与职责边界:一个 MMO 服务端长什么样
1.2本书范围与站内分工
1.3一个 MMO 服务端最少要有哪些零件
2.1阻塞、非阻塞与 Reactor
2.2goroutine-per-connection 与 Go 调度器
2.3双栈对照:goroutine、Java 虚拟线程与 Netty EventLoop
3.1消息头与命令号
3.2长度前缀、粘包与拆包
3.3协议版本与多版本兼容

第二部分:编解码与传输(第 4–6 章)

节文章
4.1二进制编解码从零写
4.2双栈对照:Go 编解码与 Netty ByteBuf 零拷贝
4.3基准:JSON、MessagePack、Protobuf 与扁平化协议
5.1为什么游戏不只用 TCP
5.2KCP 从零实现
5.3丢包与弱网模拟实测
6.1WebSocket 握手、掩码与分片
6.2心跳与超时检测
6.3断线重连与重连票据

第三部分:连接、路由与定时(第 7–9 章)

节文章
7.1会话表与连接管理
7.2顶号、踢人与连接迁移
7.3网关的职责边界
8.1路由表与请求-响应-推送
8.2消息序号、去重与顺序保证
8.3广播与扇出
9.1心跳超时与技能冷却
9.2时间轮从零实现
9.3世界时钟与 Tick 预算

第四部分:并发模型与正确性(第 10–11 章)

节文章
10.1消息驱动的实体
10.2邮箱、顺序保证与背压
10.3对照:Go channel 邮箱与 Erlang/Skynet 式 Actor
11.1请求幂等窗口
11.2命令编号与业务指纹
11.3至少一次投递下的正确性

第五部分:实时同步(第 12–14 章)

节文章
12.1状态同步与帧同步的服务端视角
12.2快照与增量编码
12.3兴趣过滤与带宽预算
13.1输入缓冲与本地预测
13.2服务器回滚与和解
13.3插值与平滑
14.1服务器时间线与时钟同步
14.2延迟补偿裁决
14.3高延迟玩家的公平性

第六部分:权威、安全与综合(第 15–18 章)

节文章
15.1权威边界与信任模型
15.2移动与战斗合法性校验
15.3异常行为信号与限速
16.1协议 fuzz 与畸形包
16.2洪泛与连接耗尽防护
16.3封包加密与签名
17.1把前 16 章拼成 aegis
17.2登录、移动与广播端到端
17.3机器人客户端与第一组承载数字
18.1卷一回顾
18.2承载数字汇总
18.3进入玩法卷

附录

篇目
附录 A aegis 卷一 API 与模块速查
附录 B 环境与复现速查
附录 C 实测数据汇总
附录 D 常见错误与 FAQ

每一节长什么样

本卷 54 节正文的结构是固定的,熟悉之后你可以快速定位自己想要的部分。

开头一段:这一节解决什么问题。 每节第一段会用一个具体场景切入,比如「服务端收到半截包」「技能冷却的定时器有几万个」。它不铺垫,直接告诉你为什么需要这一节的东西。

主体:从零写代码。 每一节都有至少一块带 // file: 与 // verify: 的完整代码。代码不是片段,是能 go test 跑绿的真实文件。凡是需要真实环境(公网、真机)的,正文会在显眼处标注「本节需真实环境,命令行不可复现」。

数字与取舍:结论由实测支撑。 涉及性能的节会给出本机实测的数字(延迟分布、吞吐、内存增量),并说明这个结论的适用边界和它的代价。本卷不会出现「快 N 倍」这类不可复现的绝对断言。

末尾:阅读导航。 每节最后一行是「上一节 / 下一节」链接。每章第 1 节的「上一节」指向本目录页,末节的「下一节」指向下一章第 1 节。你可以完全靠这一行顺序读下去,不需要回到目录。

每章第 1 节另有一张分工表。 它说明本章和站内既有文章(game/server/practice/ 下的架构文、skynet/、pitaya/ 专题)的分工——哪些问题该去看那些文章,哪些问题由本章从零解决。这张表是为了避免你重复读两遍同样的内容。

学完之后你能做什么

读完卷一,你应该具备这些能力,它们也是本卷的验收标准:

  • 能读懂任何一个服务端框架的网络层。 看到 pitaya 的网关、skynet 的 netpack、Netty 的 ChannelPipeline,你能说出每一层在做什么、瓶颈可能在哪。
  • 能自己写一个最小的长连接服务端。 协议、拆包、会话、路由、心跳、超时——不依赖任何框架,标准库就够。
  • 能诊断常见的线上症状。 延迟飙升、内存涨、连接掉、消息重复,你能沿着「网卡 → 内核 → 读协程 → 解码 → 投递 → 模拟 → 广播」这条链路逐段排除。
  • 能对同步方案做出有依据的选择。 什么项目该用状态同步、什么该用帧同步,代价分别是什么。
  • 能说出 Go 与 Java 两套栈在服务端的真实分歧点。 并发模型、内存视图、GC 行为,以及什么场景选哪个。

学不到:游戏玩法设计(卷二)、分布式与跨服(卷三)、运维与运营(卷四)。这三块本卷不涉及。

常见问题速查

你遇到的问题看哪一节
服务端收到半截包 / 两个包粘在一起3.2
老版本客户端连新服务端就崩3.3
弱网下移动一顿一顿的5.2 · 5.3
玩家掉线了,重连要重新登录很烦6.3
同一账号在两个设备登录,状态乱了7.2
网关越写越胖,什么都往里塞7.3
技能冷却的定时器有几万个,time.AfterFunc 撑不住9.2
玩家重复点击,发了两次奖励11.1 · 11.3
千人同屏,带宽爆了12.3
客户端走路一顿一顿、回弹13.2
高延迟玩家说「我明明打中了」14.2
有人开加速外挂瞬移15.2
服务端被畸形包打崩16.1
压测工具站内没有,怎么压17.3
更多报错原文与排查清单附录 D

怎么用这份索引

  • 想系统学:走路径 A,从第 1 章 1.1 开始。
  • 想抓重点:走路径 B,从第 3 章 3.2 开始。
  • 想查问题:直接用上面的「常见问题速查」,或跳到对应小节。
  • 想配代码:每一节的代码块都标了层级与来源文件,L1 的可以直接复制出来在 Go 1.26 上跑,跑不通再回附录 B 对版本。
  • 每篇正文末行都有「上一节 / 下一节」导航,也可以随时回到本页。

相关阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「mmo」更多文章

  1. 《MMO 服务器开发》工程化与运营 · 目录
  2. 《MMO 服务器开发》9.3 上线检查清单
  3. 《MMO 服务器开发》9.2 性能预算达标