CalcGuide · 技术博客主页 / 一页纸学习计划
🟠

系统设计:从容量估算到一致性与可观测

分类:工程技术 · 路径:docs/topics/system-design/README.md

#system-design#scalability#consistency#caching#observability

用 4~8 周从容量估算到能设计支撑百万级用户的可扩展系统

父主题

顶层主题

子主题(4)

系统设计:从容量估算到一致性与可观测

0. 元信息

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. 容量估算与架构分层11.5必备:QPS / 带宽 / 存储 推算
2. 缓存体系与数据层12必会 Cache-Aside 与写穿透
3. 一致性与消息12CAP / Saga / Outbox / CDC
4. 限流降级熔断与可观测0.51.5SLI/SLO 落地
5. 综合项目与白板0.51完整设计文档 + 故障复盘

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. 可观测与 SRERED / 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. 阶段通用验收

  1. 不看答案独立重写 5 种缓存模式、3 种限流算法、Saga 编排、Outbox 投递;
  2. 用自己的话解释每个组件”解决什么问题、为什么有效、什么时候失效”;
  3. 画一张图:组件图 + 数据流图 + 状态机图(至少三件套之一);
  4. 测试空数据、流量峰值 10×、节点下线 1/3、依赖超时 5s 四类边界;
  5. 准备至少 3 组自定义容量估算并贴出实际推导;
  6. 记录 P50 / P95 / P99 延迟、QPS、错误率、饱和度 4 个核心指标;
  7. 能修改已有设计(加一层缓存、换一个存储、引入异步)并用同样指标验证。

6. 最终验收

7. 综合项目

首选:百万 QPS 短链系统(必做:组件图 + 容量估算 + 5 段缓存 + 限流 + 可观测)。

备选:朋友圈 Feed 流(推拉结合 + 热点 + 限流)。
备选:秒杀系统(库存预热 + Redis 原子扣减 + 异步下单 + 防超卖)。
备选:对一套遗留单体做微服务拆分并验证一致性与降级方案。

任何综合项目都必须包含:

  1. 需求与成功标准(延迟 / QPS / 可用性 / 一致性);
  2. 容量估算(DAU / 读写比 / 峰值倍数 / 存储 / 带宽 / 成本);
  3. 组件图 + 数据流图 + 状态机图;
  4. 关键代码(5 种缓存 + 3 种限流 + Saga/Outbox + Resilience4j + OpenTelemetry);
  5. 边界测试(雪崩 / 击穿 / 穿透 / 节点下线 / 依赖超时);
  6. 压测脚本与报告(wrk / k6 / vegeta);
  7. README(设计取舍、已知限制、下一步);
  8. 故障复盘(模拟 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 / wrk2https://github.com/wg/wrkHTTP 压测,统计 P99
1压测vegetahttps://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.htmlAmazon Dynamo 思想
6消息Kafka 官方文档https://kafka.apache.org/documentation/Producer/Consumer/Partition
7限流Resilience4jhttps://resilience4j.readme.io/熔断 / 限流 / 重试
8可观测Google SRE Bookhttps://sre.google/sre-book/table-of-contents/SLI / SLO / 错误预算
8可观测Brendan Gregg「Systems Performance」https://www.brendangregg.com/books.htmlUSE 方法与内核观测
全部案例High Scalability 博客http://highscalability.com/各家系统演进史
全部案例AWS Well-Architected Frameworkhttps://aws.amazon.com/architecture/well-architected/五大支柱

默认使用顺序:先读 DDIA 14 章建立概念 → 读 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第 14 章 + 第 811 章

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 EngineeringSchemaless / 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 HochsteinChaos Engineering 实战选读

9.3.4 核心人物

人物主要影响建议追踪的材料
Eric BrewerCAP / PACELCPODC 2000 keynote、InfoQ 2012 文章
Werner VogelsAmazon CTO,最终一致性Eventually Consistent、All Things Distributed
Jeff DeanGoogle 大型系统性能、SpannerLADIS 2009 演讲、Achieving Rapid Response Times
Martin KleppmannDDIA、CRDTDDIA、Cambridge 公开课
Marc ShapiroCAP 协同工作、因果一致性1994 INRIA 报告、后续工作
Nancy LynchCAP 证明、分布式系统理论MIT 6.824 教材、Distributed Algorithms
Pat HellandSaga、消息、Life Beyond Transactions2007 论文
Chris RichardsonMicroservices Patterns微服务系列书 + InfoQ 演讲
Michael NygardRelease 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 cultureP0 必写 retrospective,blameless,行动项必须有 DRI 与 deadline故障复盘

9.3.6 重点训练材料

9.4 经典问题与经典案例

#问题为什么会重要最简答案或图示
1短链生成器(百万 QPS)容量估算、读多写少、缓存、ID 生成Snowflake / base62 + Cache-Aside + 302 跳转
2Twitter timeline 设计推 / 拉 / 推拉混合、热点、限流写扩散(fan-out on write)+ 读扩散(fan-out on read)+ 大 V 单独通道
3秒杀系统怎么防超卖高并发写、库存一致、防作弊Redis 预扣 + Lua 原子 + 异步下单 + 库存分桶
4Feed 流如何分页cursor vs offset、深翻页、热点cursor + 时间倒序 + 多级缓存
5限流令牌桶 vs 漏桶 vs 滑动窗口决定峰值形态与用户体验令牌桶允许突发、漏桶平滑、滑动窗口精确
6缓存雪崩 / 击穿 / 穿透三种缓存失效模式TTL 抖动 / 互斥锁 / 布隆过滤器
7一致性哈希为什么用于缓存节点上下线对命中率影响最小哈希环 + 虚拟节点
8CAP 在订单 / 库存 / feed 如何选不同业务对一致性与可用性取舍不同订单 CP、库存 CP/最终一致均可、feed AP
9Saga vs 2PC跨服务长事务取舍Saga 高可用无锁,2PC 强一致但阻塞
10Outbox 为什么可靠单库事务保证消息与业务原子业务表 + outbox 表 + CDC 投递
11Kafka partition 与消费者并发顺序保证与吞吐的边界key 保序 + partition 数 = 最大并发
12SLI / 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经典定理论文公开
PACELCBrewer 2012 论文InfoQ扩展框架公开
SagaGarcia-Molina & Salem 1987PODS经典论文公开
Outbox 模式工业实践模式公开
CDC(Change Data Capture)Debezium 1.x 等Debezium 社区事实标准Apache-2.0
CQRSGreg Young 2010CQRS 社区模式公开
Event SourcingFowler 2005martinfowler.com模式公开
W3C Trace Contexttrace-context-1.0W3C推荐标准公开
OpenTelemetry1.xCNCFGAApache-2.0
SLI / SLOSRE BookGoogle工业框架公开
Resilience4j2.xResilience4j 社区活跃Apache-2.0
Redis Lua7.xRedis Labs稳定BSD-3-Clause

9.6.2 Scope

9.6.3 Structure

9.6.4 Ecosystem

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

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言
  2. 数据结构与算法
  3. 计算机基础
  4. 工程技术
  5. Web 与后端
  6. 前端与客户端
  7. 数据与人工智能
  8. 项目与职业能力
  9. 安全与可靠性

本计划归属:工程技术 主 + 计算机基础 辅。


直接依赖(4)

查看知识图谱