系统设计:从容量估算到一致性与可观测
0. 元信息
- 主题路径:
docs/topics/system-design/README.md - 主分类:工程技术
- 辅助分类:计算机基础
- 适合对象:会写后端服务、做过 REST API 设计与 SQL 调优,想从单机能写过渡到「能设计支撑百万级用户的可扩展系统」的工程师
- 建议周期:4~8 周(每周 8~12 小时,至少一半时间用于画图与白板推演)
- 前置知识:
network、rest-api-design、algo-design、db-and-sql;熟悉至少一门后端语言、容器与 Linux 命令 - 最终目标:拿到一道经典系统设计题(短链 / Twitter timeline / 秒杀 / Feed 流),能在 45 分钟内画出组件图、写清数据流、定量估出容量、列出关键权衡与故障应对
1. 学习路线
容量估算(QPS / 带宽 / 存储 / 成本)
→ 架构分层(DNS / GSLB / 网关 / 业务层 / 缓存 / DB / MQ / 可观测)
→ 缓存体系(CDN / 反向代理 / 进程内 / 分布式 / Cache-Aside / Read-Through / Write-Behind / Bypass)
→ 数据与一致性(关系 / 文档 / 列存 / 时序 / 向量 / 对象存储 / CPA / PACELC)
→ 分布式事务与消息(2PC / Saga / Outbox / CDC / Kafka / RabbitMQ / 死信 / 事件溯源)
→ 限流降级熔断(令牌桶 / 漏桶 / 滑动窗口 / Resilience4j / Bulkhead)
→ 可观测与 SRE(Metrics / Logs / Traces / SLI / SLO / 错误预算 / 混沌工程)
→ 综合项目:百万 QPS 短链 / Feed 流 / 秒杀 / 单体微服务拆分
按真实请求经过的路径学。每张子主题对应一段链路,最后用综合项目把链路串起来。
2. 阶段周数分配
| 阶段 | 4 周方案 | 8 周方案 | 备注 |
|---|---|---|---|
| 1. 容量估算与架构分层 | 1 | 1.5 | 必备:QPS / 带宽 / 存储 推算 |
| 2. 缓存体系与数据层 | 1 | 2 | 必会 Cache-Aside 与写穿透 |
| 3. 一致性与消息 | 1 | 2 | CAP / Saga / Outbox / CDC |
| 4. 限流降级熔断与可观测 | 0.5 | 1.5 | SLI/SLO 落地 |
| 5. 综合项目与白板 | 0.5 | 1 | 完整设计文档 + 故障复盘 |
4 周方案只跑通最小可用路径;8 周方案有 2 周用来重做实验与白板。综合项目占最后 1 周。
3. 九阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. 容量估算 | QPS / 峰值倍数 / 带宽 / 存储 / 成本 | 一份「Twitter timeline」容量估算表 | 能用 5 分钟估出读写比例与峰值存储 |
| 2. 架构分层 | DNS / GSLB / L4 LB / L7 LB / 网关 / 业务无状态 / 数据有状态 | 一张分层组件图 | 能讲清每一层的职责与失败域 |
| 3. 缓存 | CDN / 反向代理 / 进程内 / Redis / Memcached / 写策略 | 5 种缓存模式代码 | 能选对缓存策略并解释失效链 |
| 4. 数据层 | 关系 / 文档 / 列存 / 时序 / 向量 / 对象存储 / 分库分表 / 冷热分层 | 选型决策表 | 能解释为什么用 TiDB 而非 MySQL 分库分表 |
| 5. 一致性 | CPA / PACELC / 线性一致 / 顺序一致 / 因果一致 / 最终一致 | CAP 矩阵 + 业务映射 | 能为订单/库存/feed 选对一致性级别 |
| 6. 事务与消息 | 2PC / Saga / Outbox / CDC / Kafka / RabbitMQ / 死信 | Saga 编排代码 + Outbox 投递 | 能解释为什么 Outbox 不丢消息 |
| 7. 限流降级熔断 | 令牌桶 / 漏桶 / 滑动窗口 / 隔离舱 / 熔断 / 重试 | Redis Lua 限流 + Resilience4j 配置 | 能区分 429/503/熔断三种「拒绝」 |
| 8. 可观测与 SRE | RED / USE / 黄金信号 / SLI / SLO / 错误预算 / 告警 | 一份 SLO 文档 + 仪表盘 JSON | 能用 4 个 9 反推可用性预算 |
| 9. 综合 | 把 1~8 串成一份系统设计文档 | 完整方案 + 故障复盘 | 45 分钟白板讲清一套百万 QPS 系统 |
关键陷阱:把”看过视频/书”当学会;只画组件图不写数据流;不写容量估算就讲可扩展;选缓存策略不解释失效链;把所有一致性问题都套 Saga;只看平均延迟不设 SLO。
4. 第一周任务
Day 1 约定:本计划以 Linux + Docker + 一台 8G 内存的机器为最小实验环境。所有容量估算以「DAU、读写比、对象大小」三参数为输入。所有方案都要画出组件图 + 数据流图 + 容量估算表三件套。
| 日 | 任务 | 当天交付 |
|---|---|---|
| Day 1 | 装 Docker / wrk / vegeta / Redis / MySQL;写一个最小 HTTP 服务,wrk 压 1k QPS | 环境清单 + wrk 报告 |
| Day 2 | 选「短链生成器」,写容量估算表(DAU=10M、读写=10:1、单条 200B、3 年) | 估算表 + 假设清单 |
| Day 3 | 画短链组件图:DNS → CDN → 网关 → 业务 → Redis → MySQL;标注每层 QPS / 存储 | 组件图 + 数据流图 |
| Day 4 | 写 5 种缓存模式:Cache-Aside / Read-Through / Write-Behind / Write-Through / Bypass,跑基准 | 代码 + 命中/失效日志 |
| Day 5 | 用一致性哈希实现 3 节点 Redis 客户端,模拟节点上下线对命中率的影响 | 客户端代码 + 命中率折线 |
| Day 6 | 用 Redis Lua 写令牌桶限流;用 wrk 压到触发限流,看 429 与 Retry-After | 限流脚本 + 压测报告 |
| Day 7 | 项目步骤 A:跑通短链最小可用路径(生成 + 跳转 + 容量估算 + 组件图);步骤 B:补齐 4 类边界(雪崩、击穿、穿透、热点 key) | 短链服务 + 故障演练报告 |
Day 7 步骤 A 跑通业务流;步骤 B 每类故障先在测试环境复现,再讲清防护手段。
5. 阶段通用验收
- 不看答案独立重写 5 种缓存模式、3 种限流算法、Saga 编排、Outbox 投递;
- 用自己的话解释每个组件”解决什么问题、为什么有效、什么时候失效”;
- 画一张图:组件图 + 数据流图 + 状态机图(至少三件套之一);
- 测试空数据、流量峰值 10×、节点下线 1/3、依赖超时 5s 四类边界;
- 准备至少 3 组自定义容量估算并贴出实际推导;
- 记录 P50 / P95 / P99 延迟、QPS、错误率、饱和度 4 个核心指标;
- 能修改已有设计(加一层缓存、换一个存储、引入异步)并用同样指标验证。
6. 最终验收
-
独立画出短链 / Twitter timeline / 秒杀 / Feed 流 4 套系统设计组件图 + 容量估算表 + 一致性选型;
-
至少完成 30 个设计题(neetcode system design 100 + Hello Interview + Grokking),分布建议:
子主题 题目数量 难度 平台建议 容量估算与分层 6 Easy / Medium neetcode / Hello Interview 缓存与数据层 6 Medium Grokking System Design 一致性与消息 6 Medium Designing Data-Intensive 案例 限流降级熔断与可观测 6 Medium SRE Book 案例 综合 6 Hard YouTube「System Design Interview」 约束:至少 18 道达到 Medium,至少 6 道达到 Hard;每道题必须留 45 分钟白板视频或录音。
-
完成 1 个综合项目:百万 QPS 短链 / 朋友圈 Feed / 秒杀系统,含设计文档 + 压测报告 + 故障演练;
-
能用 15 分钟讲清整套系统的组件图、数据流、容量估算、一致性选型、限流策略与 SLO 指标。
7. 综合项目
首选:百万 QPS 短链系统(必做:组件图 + 容量估算 + 5 段缓存 + 限流 + 可观测)。
- 输入:用户提交长 URL,生成 7~8 字符短链,跳转短链返回 302/301;
- 输出:必输出(1)组件图:DNS → GSLB → CDN → 网关 → 短链生成服务 → Redis → MySQL / 列存;(2)容量估算表:DAU=10M、QPS=10k peak=100k、存储 30T、Redis 内存 200G;(3)5 种缓存模式 + 3 种限流算法 + Saga/Outbox 落库;
- 关键指标:P99 跳转延迟 < 50ms、写 QPS 5k、读 QPS 50k、Redis 命中率 > 95%;
- 进阶可选:接入 OpenTelemetry、配置 SLO 99.9%、用 k6 或 wrk2 压出 100k QPS。
备选:朋友圈 Feed 流(推拉结合 + 热点 + 限流)。
备选:秒杀系统(库存预热 + Redis 原子扣减 + 异步下单 + 防超卖)。
备选:对一套遗留单体做微服务拆分并验证一致性与降级方案。
任何综合项目都必须包含:
- 需求与成功标准(延迟 / QPS / 可用性 / 一致性);
- 容量估算(DAU / 读写比 / 峰值倍数 / 存储 / 带宽 / 成本);
- 组件图 + 数据流图 + 状态机图;
- 关键代码(5 种缓存 + 3 种限流 + Saga/Outbox + Resilience4j + OpenTelemetry);
- 边界测试(雪崩 / 击穿 / 穿透 / 节点下线 / 依赖超时);
- 压测脚本与报告(wrk / k6 / vegeta);
- README(设计取舍、已知限制、下一步);
- 故障复盘(模拟 1 次 P0,写 retrospective.md)。
8. 推荐开源资料
| 阶段 | 角色 | 资料 | 链接 | 用法 |
|---|---|---|---|---|
| 全部 | 主线书 | Martin Kleppmann《Designing Data-Intensive Applications》 | https://dataintensive.net/ | 系统设计「圣经」,必读 5~12 章 |
| 全部 | 经典讲稿 | Eric Brewer「CAP Twelve Years Later」 | https://www.infoq.com/articles/cap-twelve-years-later/ | 重读 CAP 与 PACELC |
| 1 | 压测 | wrk / wrk2 | https://github.com/wg/wrk | HTTP 压测,统计 P99 |
| 1 | 压测 | vegeta | https://github.com/tsenart/vegeta | 持续压测,输出时间序列 |
| 3 | 缓存 | Redis 官方文档 | https://redis.io/docs/ | Lua / Stream / Cluster |
| 5 | 一致性 | Werner Vogels「Eventually Consistent」 | https://www.allthingsdistributed.com/2008/12/eventually_consistent.html | Amazon Dynamo 思想 |
| 6 | 消息 | Kafka 官方文档 | https://kafka.apache.org/documentation/ | Producer/Consumer/Partition |
| 7 | 限流 | Resilience4j | https://resilience4j.readme.io/ | 熔断 / 限流 / 重试 |
| 8 | 可观测 | Google SRE Book | https://sre.google/sre-book/table-of-contents/ | SLI / SLO / 错误预算 |
| 8 | 可观测 | Brendan Gregg「Systems Performance」 | https://www.brendangregg.com/books.html | USE 方法与内核观测 |
| 全部 | 案例 | High Scalability 博客 | http://highscalability.com/ | 各家系统演进史 |
| 全部 | 案例 | AWS Well-Architected Framework | https://aws.amazon.com/architecture/well-architected/ | 五大支柱 |
默认使用顺序:先读 DDIA 1
4 章建立概念 → 读 SRE Book 第 13 章建立 SLO 思维 → 用 neetcode 100 题练白板 → 选综合项目落地 → 用 Hello Interview 视频查漏 → 写复盘到notes/retrospective.md。
9. 学习资料汇聚(v0.3 自包含)
本节由本计划生成。链接指向原始材料或作者公开内容。规范会演进,记录时务必写明版本与日期。
9.1 背景与动机
分布式系统从单机能解决到多机协作,不是简单加机器。1990 年代后期互联网爆发,Eric Brewer 在 PODC 2000 提出 CAP 猜想,两年后由 Gilbert、Lynch 证明,定理 12 年后 Brewer 自己写了「CAP Twelve Years Later」纠正误读并提出 PACELC。Amazon 2007 年披露 Dynamo 论文,把最终一致性、向量时钟、Quorum、可调一致性写进工业实践。Google 2003~2012 年陆续发布 GFS、Bigtable、MapReduce、Spanner、Chubby,把共识、复制、事务的边界从论文推到工程。Martin Kleppmann 2017 年把这一切写成 Designing Data-Intensive Applications,今天它几乎是系统设计学习的标配。
今天每一个百万级系统都把”估算 → 缓存 → 一致性 → 异步 → 限流 → 观测”六个字拆成具体组件。一句话总结:系统设计不是画一张漂亮的组件图,是把 QPS、存储、延迟、可用性、故障这五个变量约束到具体技术选型上。
9.2 概念地图
flowchart LR
Estimate[容量估算 QPS/带宽/存储/成本] --> Layers[架构分层]
Layers --> LB[L4/L7/GSLB]
Layers --> Gateway[API 网关]
Layers --> App[无状态业务]
App --> Cache[缓存体系]
Cache --> CDN[CDN/反向代理]
Cache --> Local[进程内]
Cache --> Distributed[分布式 Redis/Memcached]
App --> Data[数据层]
Data --> SQL[关系/分库分表]
Data --> NoSQL[文档/列存/时序/向量/对象]
App --> MQ[消息与异步]
MQ --> Kafka[Kafka/RabbitMQ]
App --> Pattern[事务模式]
Pattern --> Saga[Saga/Outbox/CDC]
Pattern --> CAP[CPA/PACELC]
App --> RateLimit[限流降级熔断]
RateLimit --> Bulkhead[隔离舱/熔断/重试]
App --> Observability[可观测]
Observability --> SLI[SLI/SLO/错误预算]
Observability --> Chaos[混沌工程]
关系说明:容量估算决定每一层的容量目标;缓存与数据层受一致性模型约束;消息与事务解决跨服务一致;限流与熔断是边界保护;可观测提供反馈环。每一层都对应一个失败模式,必须在设计里写明应对。
9.3 基础知识讲解
9.3.1 经典论文 / 规范
| 资料 | 影响 | 建议读法 |
|---|---|---|
| Eric Brewer, CAP Twelve Years Later(InfoQ 2012) | 修正 CAP 误读,提出 PACELC | 与 Gilbert-Lynch 2002 证明一起读 |
| Seth Gilbert, Nancy Lynch, Brewer’s Conjecture and the Feasibility of Consistent, Available, Partition-tolerant Web Services(2002) | CAP 定理证明 | 看到 AP 与 CP 的可达性边界 |
| Werner Vogels, Eventually Consistent(CACM 2008) | 把最终一致性写进工业实践 | 重点看冲突解决与读修复 |
| DeCandia et al., Dynamo: Amazon’s Highly Available Key-value Store(SOSP 2007) | 一致性哈希、向量时钟、Quorum | 与 Cassandra / Riak 对照看 |
| Jeffrey Dean, Achieving Rapid Response Times in Large Online Services(2012) | 队列、批处理、长尾延迟 | 配套视频 |
| Howard Chu, LDAP at Scale(2014) | 嵌入式数据库 + 复制的工业实践 | 选读 |
| Pat Helland, Life Beyond Distributed Transactions(2007) | Saga / 消息起源 | 跨服务事务必读 |
| Chris Richardson, Microservices Patterns(Manning, 2018) | Saga / CQRS / Event Sourcing 工业整理 | 整书作为案头工具 |
| Michael Nygard, Release It!(2nd ed., Pragmatic Bookshelf, 2018) | 稳定性反模式、熔断、隔板 | 故障案例库 |
| Google SRE Book(O’Reilly, 2016) | SLI / SLO / 错误预算 / Toil | 第 1 |
9.3.2 经典书籍
| 书 | 影响 | 用法 |
|---|---|---|
| Martin Kleppmann, Designing Data-Intensive Applications(O’Reilly, 2017) | 把数据系统原理讲透 | 必读 5~9 章;案例题反复看 |
| Eric Evans, Domain-Driven Design(Addison-Wesley, 2003) | 限界上下文、聚合根 | 选读;微服务拆分时再读 |
| Sam Newman, Building Microservices(2nd ed., O’Reilly, 2021) | 微服务划分、API、契约 | 与 Richardson《Microservices Patterns》对照 |
| Brendan Gregg, Systems Performance(2nd ed., Pearson, 2020) | USE 方法、内核观测 | 第 2 章 + 第 6 章 + 第 12 章 |
| Ian Sommerville, Software Engineering(10th ed., Pearson, 2015) | 系统架构基础 | 当术语字典 |
| Cay Horstmann, Cloud Computing Patterns(Springer, 2023) | 常见云原生模式 | 选读 |
| AWS Well-Architected Framework | 五大支柱:可靠、性能、安全、成本、可持续 | 每个支柱做自检 |
| Coda Hale, Release Engineering Patterns(2020) | 发布工程 | 选读 |
| Charity Majors, Observability Engineering(O’Reilly, 2022) | 可观测工程化 | 第 4~6 章 |
| Rob Ewaschuk, Implementing Service Level Objectives(O’Reilly, 2020) | SLO 落地 | 短而实用 |
9.3.3 优秀博客
| 资料 | 特点 | 用法 |
|---|---|---|
| High Scalability | 各家系统演进史 | 选 10 篇 Twitter / Uber / Netflix 案例 |
| AWS Architecture Blog | 大型分布式系统案例 | 选 5 篇 10M+ 用户案例 |
| Netflix Tech Blog | 微服务 / 混沌工程 / Hystrix | 配合 Hystrix 已弃用看 Resilience4j |
| Uber Engineering | Schemaless / Ringpop / Cadence | 看异地多活与一致性 |
| Discord Engineering | 存储演进 + Trillions of messages | 看 Cassandra → ScyllaDB 迁移 |
| Cloudflare Blog | 边缘、QUIC、Workers | 配合 9.6.6 一手材料 |
| Brendan Gregg | 性能与 eBPF | 故障定位方法论 |
| Charity Majors | 可观测工程化 | 配合 Observability Engineering |
| Marc Shapiro 主页 | CAP / 事务原始论文 | 找 1994 年协同工作 |
| Lorin Hochstein | Chaos Engineering 实战 | 选读 |
9.3.4 核心人物
| 人物 | 主要影响 | 建议追踪的材料 |
|---|---|---|
| Eric Brewer | CAP / PACELC | PODC 2000 keynote、InfoQ 2012 文章 |
| Werner Vogels | Amazon CTO,最终一致性 | Eventually Consistent、All Things Distributed |
| Jeff Dean | Google 大型系统性能、Spanner | LADIS 2009 演讲、Achieving Rapid Response Times |
| Martin Kleppmann | DDIA、CRDT | DDIA、Cambridge 公开课 |
| Marc Shapiro | CAP 协同工作、因果一致性 | 1994 INRIA 报告、后续工作 |
| Nancy Lynch | CAP 证明、分布式系统理论 | MIT 6.824 教材、Distributed Algorithms |
| Pat Helland | Saga、消息、Life Beyond Transactions | 2007 论文 |
| Chris Richardson | Microservices Patterns | 微服务系列书 + InfoQ 演讲 |
| Michael Nygard | Release It! 稳定性反模式 | 2018 第 2 版 |
| Robert Hanmer | 模式:可观察、缓存、容错 | Patterns for Fault Tolerant Software |
9.3.5 开发方法
| 方法 | 具体动作 | 何时用 |
|---|---|---|
| Capacity-first | 先写 DAU / 读写比 / 峰值倍数 / 存储 / 带宽 / 成本,再画组件 | 任何白板题第一步 |
| Layered failure analysis | 每层列:职责、依赖、失败模式、降级策略 | 画组件图时同步进行 |
| Cache-aside default | 读多写少时默认 Cache-Aside;写多读多时考虑 Write-Behind | 缓存策略选择 |
| Saga for cross-service | 跨服务用 Saga + Outbox,不要试图做分布式 2PC | 订单、库存等长事务 |
| Eventual consistency as feature | 把最终一致写进 SLA,不要承诺线性一致 | 社交、Feed、推荐 |
| SLI-first SLO | 先选 SLI(延迟、错误率、饱和度),再算 4 个 9,再算错误预算 | 任何可观测建设 |
| Single-variable chaos | 一次只注入一种故障:节点下线 / 网络延迟 / 依赖超时 / DNS 失败 | 混沌演练 |
| Backpressure everywhere | 限流 + 熔断 + 队列长度保护三件套 | 任何写路径 |
| Trace as contract | 上下游用 W3C Trace Context 串联,traceid 进入日志与告警 | 跨服务排障 |
| Postmortem culture | P0 必写 retrospective,blameless,行动项必须有 DRI 与 deadline | 故障复盘 |
9.3.6 重点训练材料
- DDIA 配套案例:第 5~9 章每章末尾的”案例研究”是顶级题源(Twitter timeline 用 Cassandra、LinkedIn 用 Espresso、Facebook 用 MySQL + Memcached)。
- neetcode system design 100:按难度分层的题库,覆盖短链、URL 限流、Twitter、Uber、DropBox 等经典题。
- Grokking System Design(Educative):题库配合图解,适合白板练习。
- Hello Interview:视频 + 思维框架,按 15 步白板法练习。
- SRE Book 案例:第 8~11 章真实故障复盘,每篇都是 SLI/SLO 的实战教学。
9.4 经典问题与经典案例
| # | 问题 | 为什么会重要 | 最简答案或图示 |
|---|---|---|---|
| 1 | 短链生成器(百万 QPS) | 容量估算、读多写少、缓存、ID 生成 | Snowflake / base62 + Cache-Aside + 302 跳转 |
| 2 | Twitter timeline 设计 | 推 / 拉 / 推拉混合、热点、限流 | 写扩散(fan-out on write)+ 读扩散(fan-out on read)+ 大 V 单独通道 |
| 3 | 秒杀系统怎么防超卖 | 高并发写、库存一致、防作弊 | Redis 预扣 + Lua 原子 + 异步下单 + 库存分桶 |
| 4 | Feed 流如何分页 | cursor vs offset、深翻页、热点 | cursor + 时间倒序 + 多级缓存 |
| 5 | 限流令牌桶 vs 漏桶 vs 滑动窗口 | 决定峰值形态与用户体验 | 令牌桶允许突发、漏桶平滑、滑动窗口精确 |
| 6 | 缓存雪崩 / 击穿 / 穿透 | 三种缓存失效模式 | TTL 抖动 / 互斥锁 / 布隆过滤器 |
| 7 | 一致性哈希为什么用于缓存 | 节点上下线对命中率影响最小 | 哈希环 + 虚拟节点 |
| 8 | CAP 在订单 / 库存 / feed 如何选 | 不同业务对一致性与可用性取舍不同 | 订单 CP、库存 CP/最终一致均可、feed AP |
| 9 | Saga vs 2PC | 跨服务长事务取舍 | Saga 高可用无锁,2PC 强一致但阻塞 |
| 10 | Outbox 为什么可靠 | 单库事务保证消息与业务原子 | 业务表 + outbox 表 + CDC 投递 |
| 11 | Kafka partition 与消费者并发 | 顺序保证与吞吐的边界 | key 保序 + partition 数 = 最大并发 |
| 12 | SLI / SLO / 错误预算 怎么落地 | 可观测的「可衡量」起点 | 选指标 → 算 99.9% → 算月度预算 |
| 13 | 限流应该在哪一层做 | 越靠前越省资源,越靠后越精确 | L7 网关层 + 进程内 + 资源池(Bulkhead) |
| 14 | 熔断与降级的区别 | 触发条件与动作不同 | 熔断是快速失败,降级是功能裁剪 |
| 15 | 怎么设计一个事件溯源系统 | 用 Event Sourcing + CQRS 解决审计与重放 | 事件存储 + 物化视图 + 快照 |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| CAP 与 PACELC | 误读”三选二” | 重读 Brewer 2012;用真实业务做 CP/AP 分类 |
| 一致性级别(线性 / 顺序 / 因果 / 最终) | 概念阶梯 | 用 Redis 顺序一致、Cassandra 最终一致做对照实验 |
| 写策略五件套(Cache-Aside / Read-Through / Write-Behind / Write-Through / Bypass) | 容易混 | 每种都画数据流图,跑基准对比命中/失效/延迟 |
| Saga 编排 vs 编舞 | 协调方不同 | 编排 = 中央协调器;编舞 = 事件驱动;画状态机对比 |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 容量估算 | 不会起步 | 用 DAU × 读写比 × 对象大小 × 留存期 起步;峰值取 5~10× |
| 把现象映射到层 | 慢、不通、错都是分层结论 | 拆成 DNS / 网关 / 业务 / 缓存 / DB / MQ / 依赖 |
| 单点证据局限 | 没看到 = 不发生? | 列观察点;用 trace 串联;必要时两端抓 |
| 限流策略选错 | 用错场景 | 令牌桶适合 API 网关、漏桶适合消息写入、滑动窗口适合风控 |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| Redis 集群调优 | 大 key / 热 key / fork 阻塞 | 监控 latency、bigkeys、内存碎片 |
| Kafka 顺序保证 | partition 内才保序 | key 选用户 id;partition 数 ≥ 最大并发 |
| Saga 补偿失败 | 补偿也可能挂 | 幂等 + 重试 + 死信 + 人工 |
| OpenTelemetry 串联 | 多语言不统一 | 用 OTLP + collector;自动注入与手动埋点结合 |
| 混沌工程落地 | 生产不敢注入 | 先在预发做;用 Litmus / ChaosBlade;先低风险实验 |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 版本 / 文档 | 发布组织 | 状态 | 许可证 / 可访问性 |
|---|---|---|---|---|
| CAP 定理 | Gilbert-Lynch 2002 证明 | PODC / IEEE | 经典定理 | 论文公开 |
| PACELC | Brewer 2012 论文 | InfoQ | 扩展框架 | 公开 |
| Saga | Garcia-Molina & Salem 1987 | PODS | 经典论文 | 公开 |
| Outbox 模式 | 工业实践 | — | 模式 | 公开 |
| CDC(Change Data Capture) | Debezium 1.x 等 | Debezium 社区 | 事实标准 | Apache-2.0 |
| CQRS | Greg Young 2010 | CQRS 社区 | 模式 | 公开 |
| Event Sourcing | Fowler 2005 | martinfowler.com | 模式 | 公开 |
| W3C Trace Context | trace-context-1.0 | W3C | 推荐标准 | 公开 |
| OpenTelemetry | 1.x | CNCF | GA | Apache-2.0 |
| SLI / SLO | SRE Book | 工业框架 | 公开 | |
| Resilience4j | 2.x | Resilience4j 社区 | 活跃 | Apache-2.0 |
| Redis Lua | 7.x | Redis Labs | 稳定 | BSD-3-Clause |
9.6.2 Scope
- CAP / PACELC:分布式系统的理论边界,不直接指导实现。
- Saga / Outbox / CDC:跨服务事务模式,不替代单库事务。
- W3C Trace Context / OpenTelemetry:跨进程追踪协议,不替代应用日志。
- SLI / SLO:错误预算的具体载体,不替代告警规则。
- Resilience4j:JVM 上的稳定性库,不替代网关层限流。
9.6.3 Structure
- 容量估算公式:
QPS = DAU × 每用户操作数 / 时间窗口;存储= 留存期 × QPS × 对象大小 × 副本系数。 - 写策略:Cache-Aside(应用层管)、Read-Through(缓存层管)、Write-Behind(异步写回)、Write-Through(同步写穿)、Bypass(直写)。
- Saga:编排(Orchestration)由中央协调器调用;编舞(Choreography)由事件驱动。
- 错误预算:
Budget = (1 - SLO) × 时间窗口。 - 必会接口:Redis
INCR/ Lua、Kafka Producer / Consumer / Consumer Group、Sentinel / Hystrix 风格的熔断配置、OpenTelemetry SDK / OTLP。
9.6.4 Ecosystem
- 缓存:Redis、Memcached、CDN(Nginx / Cloudflare / Akamai)、Hazelcast、Caffeine。
- 数据库:MySQL、PostgreSQL、TiDB、CockroachDB、MongoDB、Cassandra / ScyllaDB、ClickHouse、InfluxDB、Milvus、Weaviate、MinIO。
- 消息:Kafka、RabbitMQ、Pulsar、NATS、Redis Streams。
- 网关与限流:Kong、Envoy、APISIX、AWS API Gateway、Sentinel、Resilience4j。
- 可观测:Prometheus、Grafana、OpenTelemetry、Jaeger、Tempo、Elastic、Loki、Datadog。
- 混沌:ChaosBlade、Litmus、Gremlin、Chaos Mesh。
9.6.5 Depth Tiers
| 层级 | 能力 | 系统设计主题的可观察标准 |
|---|---|---|
| L0 | 知道存在 | 知道 CAP / 缓存 / 限流 / 可观测 各自解决什么问题 |
| L1 | 看得懂示例 | 能读懂组件图、容量估算表、Saga 编排代码 |
| L2 | 能正确调用 | 能用 Redis Lua 写限流、用 Kafka 写生产消费、用 OTel 串联 trace |
| L3 | 能解释与排错 | 能在 45 分钟内白板讲清一套百万 QPS 系统,能定位缓存雪崩、消息积压、限流失效 |
| L4 | 能设计与扩展 | 能为一个新业务选型、拆分、设定 SLO、设计故障演练 |
本计划目标:L3。综合项目可触及局部 L4,但不作为 4~8 周的硬门槛。
9.6.6 Source
- Martin Kleppmann 主页 与 DDIA:数据系统原理。
- Werner Vogels 博客:Amazon Dynamo 思想。
- Jeff Dean 2009 LADIS 演讲:大规模系统设计哲学。
- Google SRE Book 全文:SLI / SLO / 错误预算。
- AWS Well-Architected:五大支柱。
- High Scalability:经典案例。
- 引用版本快照日期:2026-07-30。规范与论文版本相对稳定;库版本以 2026 年 7 月为准。
10. 常见误区
- 把”画组件图”当系统设计;不写容量估算、不写数据流、不写失败应对;
- 把 CAP 当”三选二”,忽略网络分区是常态;
- 所有跨服务事务都上 2PC,忽略 Saga 更适合业务;
- 写策略只用 Cache-Aside,忽略 Read-Through / Write-Behind / Bypass;
- 限流只在网关做,忽略进程内 Bulkhead;
- 缓存失效用”加随机 TTL”一句话带过,不做雪崩演练;
- 限流后不返回 Retry-After,客户端瞎重试;
- 消息总线只关心发送,不做幂等、不做死信、不做重放;
- 把平均延迟当 SLO,忽略 P99 / P999;
- 没有错误预算,告警阈值随手设;
- 混沌工程只在测试环境做,忽略预发与生产低风险实验;
- traceid 不进日志,跨服务排障靠猜;
- 用 SLO 当 KPI,导致团队不敢发版;
- 综合项目只画图不写代码;
- 学完不复盘,下次面试依然答不上来。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
- 安全与可靠性
本计划归属:工程技术 主 + 计算机基础 辅。