文档目录
综合实战
本章定位:把前八章串成一个完整闭环——从「定义目标」到「设立门禁」,产出一份可对外汇报的性能报告。
前置知识:第 0–8 章全部 预计总时长:约 3–5 天(这不是一次性读完的章节,是一个实施指南) 配套代码:docs/code/09-capstone/
一、这一章与前八章的关系
前八章是方法,这一章是把这些方法用在一个真实项目上:
| 步骤 | 用到哪一章 | 产出 |
|---|---|---|
| 1. 定义目标 | 第 1 章 | SLO 表 + 延迟预算表 |
| 2. 搭服务与数据 | 第 3 章 | 可运行的服务 + 固定数据集 |
| 3. 建立基线 | 第 4、5 章 | 基线数据 + 噪声底线 |
| 4. 找拐点 | 第 1、3 章 | 容量曲线 + 拐点 |
| 5. 剖析定位 | 第 6 章 | 瓶颈清单(含贡献占比) |
| 6. 优化验证 | 第 7 章 | 优化收益报告(含代价与被否决方案) |
| 7. 长稳回归 | 第 3 章 | 浸泡结果 + 回归确认 |
| 8. 固化与交付 | 第 8 章 | 门禁 + 容量表 + 性能报告 |
注意:每一步都依赖前一步——跳过第 3 步(基线)就无法做第 6 步(优化验证),因为你没有 before。
二、项目设定:短链服务
为什么选短链服务:
| 特征 | 对应本书的哪个知识点 |
|---|---|
| 读写比例悬殊(读多写少) | 缓存(第 7.4 节) |
| 存在天然热点(热门短链) | 幂律分布(第 5.5 节) |
| 读路径有缓存命中/未命中两条路径 | 缓存对 P99 的影响(第 7.4 节) |
| 写路径有唯一索引冲突 | 数据库错误处理(第 6.6 节) |
| 可以自然演化出慢查询 | 索引与执行计划(第 6.6 节) |
| 简单到能在一周内做完 | 让你专注于性能而不是业务 |
技术栈:Ktor + Kotlin 协程 + PostgreSQL + Redis(与全书一致)
三、小节地图
| 节 | 步骤 | 一句话 | 用时 |
|---|---|---|---|
| 1 | 项目设定与埋雷清单 | 故意保留 6 个问题,作为定位练习的素材 | 2 h |
| 2 | 步骤一:定义目标 | SLO 四要素 + 延迟预算 | 2 h |
| 3 | 步骤二:搭服务与数据 | 真实依赖、100 万行、幂律分布 | 1 天 |
| 4 | 步骤三:建立基线与噪声底线 | 没有基线就没有优化 | 半天 |
| 5 | 步骤四:容量曲线与拐点 | 拐点才是容量 | 半天 |
| 6 | 步骤五:剖析定位 | 在拐点处剖析,产出瓶颈清单 | 半天 |
| 7 | 步骤六:优化与验证 | 三问纪律 + 主动否决 | 1 天 |
| 8 | 步骤七:长稳与回归 | 浸泡测试 + 基线复跑 | 半天 |
| 9 | 步骤八:固化门禁与交付报告 | 门禁 + 容量表 + 报告 + 评分 | 1 天 |
| 10 | Lab 9:总编排 | 一键驱动八个步骤 | — |
四、本章的最终交付物
八份文件,它们本身就是一份完整的性能工程成果:
| # | 文件 | 内容 | 来自 |
|---|---|---|---|
| 1 | docs/slo.md |
SLO 表 + 延迟预算表 | 步骤一 |
| 2 | docker-compose.yml + seed.sql |
一键起环境 + 灌数据 | 步骤二 |
| 3 | experiments/E09-baseline/ |
基线数据 + 噪声底线 | 步骤三 |
| 4 | experiments/E10-capacity/ |
容量曲线 + 拐点 | 步骤四 |
| 5 | bottlenecks.md |
瓶颈清单(含证据链、贡献占比、被排除的假设) | 步骤五 |
| 6 | OPTIMIZATION.md |
优化收益报告(含代价、否决记录) | 步骤六 |
| 7 | soak.csv + 回归结果 |
长稳数据 + 回归确认 | 步骤七 |
| 8 | perf-gate.yml + capacity.md + PERF-REPORT.md |
门禁 + 容量表 + 最终报告 | 步骤八 |
关键:第 8 份(最终报告)的价值不在于数字漂亮,而在于「别人能按你的方法复现出同样的数字」。
五、评分标准
| 维度 | 不合格 | 合格 | 优秀 |
|---|---|---|---|
| 目标定义 | 只有「要快」 | 有 SLO 但缺负载前提 | SLO + 延迟预算 + 崩溃线 |
| 数据可信度 | 单次运行、无环境记录 | 多次运行、有元数据 | 有噪声底线与置信区间 |
| 瓶颈定位 | 靠猜或只看火焰图 | 有指标 + 火焰图证据 | 有证据链、贡献占比、被排除的假设 |
| 优化验证 | 只给 after | 有 before/after | 有代价分析、长稳回归、否决记录 |
| 报告表达 | 只有数字 | 结构完整 | 能被非性能工程师用于决策 |
| 持续化 | 无 | 有门禁脚本 | 门禁经噪声验证、有告警与容量表 |
评分的核心是「可复现」与「可决策」,不是「数字有多好」。
六、怎么用这一章
三种用法:
| 用法 | 适合谁 | 做法 |
|---|---|---|
| 完整实施 | 想系统练一遍的人 | 按步骤 1–8 全部做完(3–5 天) |
| 只读流程 | 想了解全貌的人 | 读 10 个小节,理解「每一步为什么必要」 |
| 当模板用 | 手上有真实项目的人 | 把每节的清单套到自己的服务上 |
推荐第一种——因为性能工程的很多细节,只有亲手做过才知道(比如「噪声底线到底有多大」「幂律分布怎么造」「火焰图上什么样叫宽而平」)。
七、一个提醒:不要追求「完美」
真实的性能工程不是「把所有指标都做到极致」,而是:
✅ 在有限时间里,把最关键的问题解决到「可验证、可维持」的程度
❌ 花两周把 P99 从 95ms 优化到 92ms(在噪声范围内,无法证实)
本章的验收标准是:
- 你的证据链完整(能复现)
- 你的结论有边界(写了未覆盖的场景)
- 你的机制能持续(门禁零误报)
而不是:P99 有多低。
本节目录
- 项目设定与埋雷清单 9.1 项目设定与埋雷清单 上一节:无 | 下一节:9.2 步骤一:定义目标 配套代码:09-capstone/01-project-setup 一句话结论 …
- 步骤一 9.2 步骤一:定义目标 上一节:9.1 项目设定与埋雷清单 | 下一节:9.3 步骤二:搭服务与数据 用到:第 1 章(SLO 四要素、延迟预算) 配套代 …
- 步骤二 9.3 步骤二:搭服务与数据 上一节:9.2 步骤一:定义目标 | 下一节:9.4 步骤三:建立基线与噪声底线 用到:第 3 章(组件基准、真实依赖)、第 …
- 步骤三 9.4 步骤三:建立基线与噪声底线 上一节:9.3 步骤二:搭服务与数据 | 下一节:9.5 步骤四:容量曲线与拐点 用到:第 4 章(观测)、第 5.7 …
- 步骤四 9.5 步骤四:容量曲线与拐点 上一节:9.4 步骤三:建立基线与噪声底线 | 下一节:9.6 步骤五:剖析定位 用到:第 1.6 节(容量曲线)、第 …
- 步骤五 9.6 步骤五:剖析定位 上一节:9.5 步骤四:容量曲线与拐点 | 下一节:9.7 步骤六:优化与验证 用到:第 6 章(五步法、延迟分解、火焰图、瓶颈模 …
- 步骤六 9.7 步骤六:优化与验证 上一节:9.6 步骤五:剖析定位 | 下一节:9.8 步骤七:长稳与回归 用到:第 7 章(优先级金字塔、三问纪律、否决记录) …
- 步骤七 9.8 步骤七:长稳与回归 上一节:9.7 步骤六:优化与验证 | 下一节:9.9 步骤八:固化门禁与交付报告 用到:第 3.5 节(浸泡测试)、第 7.8 …
- 步骤八 9.9 步骤八:固化门禁与交付报告 上一节:9.8 步骤七:长稳与回归 | 下一节:9.10 Lab 9:总编排 用到:第 8 章(门禁、告警、容量规划)、 …
- Lab 9 9.10 Lab 9:总编排 上一节:9.9 步骤八:固化门禁与交付报告 | 下一节:无(全书结束) 配套代码:09-capstone/README 预计时 …