学习地图:官方九章与三条能力路径
按原书九章重建学习地图:语言/调试、并发/网络/协议、服务结构/Redis 源码、生产模块,并为建设、事故和源码阅读设置能力门槛。
学习目标
- 能说出官方九章的输入、输出与依赖,区分语言/调试基础、并发/网络机制、服务源码与生产模块
- 能设计建设、故障排查或 Redis 源码阅读路径,解释为何不能跳过 ownership、artifact、socket state 与 protocol framing
- 能判断每章是否真正通过,用实现、取证、源码调用链和生产故障演练代替“读完了”的主观进度
为什么必须重画这本书的地图
这本书不是“epoll、线程池、缓冲区、时间轮”的十篇主题教程。权威目录明确是九章:前两章建立 C++ 与工具链,3~6 章覆盖并发、网络、排障和协议,7~8 章落到单服务结构与 Redis 源码,第 9 章补全重连、心跳、日志、错误码和监控。
↡以原书九章为唯一目录骨架,并为每章定义知识输入、可观察输出和通过证据的学习导航。先预测第 8 章 Redis 源码分析依赖哪些前章:只懂 epoll 是否足够?选择下图各章,观察它还需要 client lifetime、thread ownership、RESP framing 与调试 artifact。
逐章查看输入、输出与能力门槛
第一段:第 1~2 章建立代码与证据基础
第 1 章的 RAII、pimpl、modern C++ 与 smart pointers 定义对象、资源和编译边界;第 2 章的 Make/CMake、symbols、build-id 与 GDB 定义“如何证明当前 binary 正在执行哪段代码”。没有这两章,后面的连接 owner、thread lifetime 和 Redis breakpoint 都缺可靠基础。
source revision + compiler flags + binary + debug symbols + build-id
↓
reproducible stack / core evidence第二段:第 3~6 章解释并发、字节与故障
第 3 章定义 thread lifecycle、atomic/mutex/condition、pool/backpressure;第 4 章把 socket return value 变成连接状态机;第 5 章把症状变成 interface→path→socket→process→app→packet 证据链;第 6 章在 TCP stream 上建立 framing、TLV/version 与应用协议 parser。
shared state --happens-before--> deterministic thread behavior
TCP bytes --framing---------> deterministic message behavior
symptom --evidence chain--> falsifiable incident conclusion第三段:第 7~9 章完成服务、源码与生产闭环
第 7 章把 fd、EventLoop、Connection、Buffer、Session、Timer 与 worker result 放进 single-loop ownership;第 8 章沿 Redis 6.0 initServer → acceptTcpHandler → readQueryFromClient → processInputBuffer → writeToClient → freeClient 验证真实实现;第 9 章补上重连/心跳/日志/错误码/monitoring port。
client bytes → owner EventLoop → decoder → command/business → output buffer
↑ ↓
reconnect/heartbeat ← fault contract ← logs/error/metrics/monitor一个贯穿九章的最小验证项目
不要为每章另做互不关联的 demo。可以持续演进同一个 echo/key-value service:第 1 章先用 RAII 包装 fd、thread 与 buffer owner,第 2 章保存 debug build 与 build-id;第 3 章加入可停止 worker 和 bounded queue,第 4 章把 listen/connect/read/write 全部改为 nonblocking state machine,第 5 章为同一连接保留 client/server 两端取证脚本。
第 6 章在 input buffer 上实现 length-prefix/TLV decoder,并用随机 chunk、oversize、unknown version 测试;第 7 章把 fd 分配到 single-owner EventLoop,加入 output high-water、timer 与 deferred close;第 8 章再对照 Redis 6.0 的 ae/client/RESP/reply/free 调用链,检查自己的边界是否有源码级先例;第 9 章加入 retry/heartbeat、结构化 error/log/metrics 与隔离 monitor port。
↡用同一个可运行服务逐章加入 lifetime、debug、concurrency、network、protocol、architecture、source comparison 与 operations,并保留每步回归证据的方法。每次演进都必须能回退和比较:记录 binary identity、测试输入、连接/请求 id、queue/buffer upper bounds、故障注入结果与性能基线。这样你能判断某次“优化”究竟降低了 syscall/latency,还是引入了新的 lifetime、backpressure 或 observability 缺口;最终项目也自然成为九章综合验收,而不是读完后再临时拼装一套示例。
所有 gate 还应固定随机种子与环境参数,确保失败可以重复定位。
三条学习路径:建设、事故与源码
按当前目标选择依赖路径
路径可以裁剪,依赖不能伪造。已有 C++ 基础的读者仍应做第 1 章 owner gate;熟悉 GDB 的读者仍应证明 symbol/build-id 匹配。
每章如何验收
勾选真正有证据的章节 gate
本章回顾:九章是一条证据驱动的服务链
- 第 1~2 章提供 lifetime 与 artifact/debug evidence。
- 第 3~6 章提供 thread、socket、incident 与 protocol contracts。
- 第 7 章组装单服务,第 8 章用 Redis 源码验证,第 9 章补全运行恢复与可观测性。
- 建设、事故和源码阅读可选择不同入口,但都不能跳过其依赖证据。
- 每章用 evidence gate 验收,最终用全链路故障注入证明综合能力。
练习
问题 1:为什么第 8 章 Redis 源码分析不能只先修第 4 章 epoll?
问题 2:生产 connect timeout 应从哪条路径学习和取证?
问题 3:怎样证明第 7 章单服务结构真正通过,而不是会画 Reactor 图?
术语表
名词解释
本章出现的专业名词,用大白话再讲一遍。
- official nine-chapter map
- debug evidence foundation
- service operational closure
- cross-chapter proof project
- chapter evidence gate