目录
欢迎来到《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 做端到端断言 |
| L2J | Java 对照实现 | 经 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.2 | goroutine-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.2 | KCP 从零实现 |
| 5.3 | 丢包与弱网模拟实测 |
| 6.1 | WebSocket 握手、掩码与分片 |
| 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 对版本。
- 每篇正文末行都有「上一节 / 下一节」导航,也可以随时回到本页。
相关阅读
- 游戏服务端专题 :网络模型、同步方案与分布式架构
- 游戏服务端实战专题导航 :170 篇架构设计与取舍
- 游戏引擎实现原理 :从零写一个 3D 引擎的四卷本
- 书稿书架 :全部电子书与创作手记
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。