# 知识体系大纲

## 第一部分：系统设计原则

### 1. 高可用（High Availability）⭐⭐⭐⭐⭐

#### 1.1 可用性度量

* **可用性计算**
  * 可用率 = 正常运行时间 / 总时间
  * 99.9%（3 个 9）：年停机时间 8.76 小时
  * 99.99%（4 个 9）：年停机时间 52.56 分钟
  * 99.999%（5 个 9）：年停机时间 5.26 分钟
* **SLA（Service Level Agreement）**
  * 服务等级协议
  * 定义服务质量标准
  * 违约赔偿机制

#### 1.2 高可用设计策略

* **消除单点故障（SPOF）**
  * 冗余部署：多实例部署
  * 故障检测：健康检查、心跳机制
  * 故障转移：自动切换、手动切换
* **负载均衡**
  * DNS 负载均衡
  * 硬件负载均衡（F5）
  * 软件负载均衡（Nginx、LVS、HAProxy）
  * 应用层负载均衡（Dubbo、Spring Cloud）
* **限流降级熔断**
  * 限流：保护系统不被压垮
  * 降级：保证核心功能可用
  * 熔断：快速失败，避免雪崩
* **超时与重试**
  * 设置合理的超时时间
  * 重试策略：指数退避、抖动
  * 幂等性设计
* **异地多活**
  * 多数据中心部署
  * 数据同步
  * 流量调度

#### 1.3 容灾与备份

* **备份策略**
  * 全量备份 vs 增量备份
  * 备份频率和保留时间
  * 异地备份
* **灾难恢复（DR）**
  * RTO（恢复时间目标）
  * RPO（恢复点目标）
  * 容灾演练

### 2. 高并发（High Concurrency）⭐⭐⭐⭐⭐

#### 2.1 系统分层

* **接入层**
  * CDN：静态资源加速
  * 网关：统一入口、限流鉴权
  * 负载均衡：流量分发
* **应用层**
  * 无状态设计：便于水平扩展
  * 服务拆分：微服务化
  * 异步处理：消息队列
* **数据层**
  * 缓存：减少数据库压力
  * 读写分离：主从架构
  * 分库分表：数据分片

#### 2.2 缓存设计

* **缓存策略**
  * Cache Aside：旁路缓存
  * Read Through / Write Through：直写缓存
  * Write Behind：异步写
* **缓存问题及解决方案**
  * 缓存穿透：布隆过滤器、空值缓存
  * 缓存击穿：互斥锁、永不过期
  * 缓存雪崩：过期时间打散、多级缓存
  * 缓存一致性：删除缓存、延迟双删、订阅 Binlog
* **缓存淘汰策略**
  * LRU（最近最少使用）
  * LFU（最不经常使用）
  * FIFO（先进先出）
  * Random（随机淘汰）

#### 2.3 数据库优化

* **索引优化**
  * 合理创建索引
  * 避免索引失效
  * 覆盖索引
* **SQL 优化**
  * 避免全表扫描
  * 分页优化
  * 批量操作
* **读写分离**
  * 主库写、从库读
  * 延迟问题：强制读主库、延迟读从库
* **分库分表**
  * 垂直拆分：按业务拆分
  * 水平拆分：按数据拆分
  * 跨库查询、分布式事务

#### 2.4 消息队列

* **异步解耦**
  * 流量削峰
  * 系统解耦
  * 异步处理
* **可靠性保证**
  * 消息持久化
  * 生产者确认
  * 消费者确认
  * 幂等消费

#### 2.5 性能优化

* **前端优化**
  * 静态资源压缩
  * 浏览器缓存
  * CDN 加速
  * 图片懒加载
* **后端优化**
  * 连接池：数据库、Redis、HTTP
  * 线程池：异步任务
  * 批量操作：减少网络往返
  * 本地缓存：减少网络调用

### 3. 可扩展性（Scalability）⭐⭐⭐⭐

#### 3.1 垂直扩展（Scale Up）

* 增加单机资源：CPU、内存、磁盘
* 优点：简单直接
* 缺点：有上限、成本高、仍有单点

#### 3.2 水平扩展（Scale Out）

* 增加机器数量
* 优点：理论上无上限、成本低
* 缺点：架构复杂、需要分布式方案

#### 3.3 可扩展架构设计

* **无状态设计**
  * 应用服务器不保存状态
  * 状态外置：数据库、缓存、Session 服务器
* **服务化拆分**
  * 按业务边界拆分
  * 按性能要求拆分
* **数据分片**
  * 哈希分片
  * 范围分片
  * 一致性哈希

### 4. 安全性（Security）

#### 4.1 认证与授权

* **认证（Authentication）**
  * 用户名密码
  * OAuth 2.0
  * JWT Token
  * 单点登录（SSO）
* **授权（Authorization）**
  * RBAC（基于角色）
  * ABAC（基于属性）
  * ACL（访问控制列表）

#### 4.2 数据安全

* **加密**
  * 传输加密：HTTPS、TLS
  * 存储加密：敏感数据加密
  * 密码加密：bcrypt、scrypt
* **防护**
  * SQL 注入：参数化查询
  * XSS 攻击：输入验证、输出编码
  * CSRF 攻击：Token 验证
  * DDoS 攻击：限流、IP 黑名单

## 第二部分：系统设计要素 ⭐⭐⭐⭐⭐

### 5. 容量估算

#### 5.1 流量估算

* **QPS / TPS 计算**
  * 日活用户（DAU）
  * 每用户平均请求数
  * 峰值流量：平均流量 × 3-5 倍
  * 示例：1000 万 DAU，每人 10 次请求
    * 日请求：1 亿次
    * QPS：1 亿 / 86400 ≈ 1200
    * 峰值 QPS：1200 × 3 = 3600

#### 5.2 存储估算

* **数据量计算**
  * 单条数据大小
  * 数据增长速度
  * 保留时间
  * 示例：每天 100 万条消息，每条 1KB
    * 日增量：1GB
    * 年增量：365GB
    * 3 年数据：约 1TB

#### 5.3 带宽估算

* **网络带宽**
  * 峰值 QPS × 平均响应大小
  * 示例：3600 QPS，每次响应 10KB
    * 带宽：3600 × 10KB = 36MB/s ≈ 288Mbps

### 6. 数据存储设计

#### 6.1 存储选型

* **关系型数据库（MySQL、PostgreSQL）**
  * 强一致性
  * 事务支持
  * 复杂查询
  * 适合：用户信息、订单、账户
* **NoSQL 数据库**
  * Redis：高性能缓存、计数器、排行榜
  * MongoDB：文档存储、灵活 Schema
  * Cassandra：高可用、写密集
  * HBase：大数据量、列式存储
* **文件存储**
  * 本地文件系统
  * 对象存储（OSS、S3）
  * 分布式文件系统（HDFS、GFS）
* **消息队列**
  * Kafka：高吞吐、日志收集
  * RabbitMQ：可靠性高
  * RocketMQ：事务消息

#### 6.2 数据模型设计

* **用户表设计**
  * 主键：自增 ID vs UUID vs 雪花算法
  * 索引设计：唯一索引、联合索引
  * 冗余字段：空间换时间
* **关系设计**
  * 一对一、一对多、多对多
  * 外键 vs 应用层维护
* **时间序列数据**
  * 分表策略：按天、按月
  * 冷热数据分离
  * 归档策略

### 7. 接口设计

#### 7.1 API 设计原则

* **RESTful 设计**
  * 资源导向：名词 + HTTP 方法
  * 统一接口：GET、POST、PUT、DELETE
  * 无状态
* **版本管理**
  * URL 版本：/v1/users
  * Header 版本：X-API-Version
* **分页设计**
  * 偏移分页：offset + limit
  * 游标分页：cursor based
  * 深分页问题

#### 7.2 接口性能

* **批量接口**
  * 减少网络往返
  * 注意接口粒度
* **异步接口**
  * 长耗时操作
  * 轮询 vs Webhook
* **接口限流**
  * 用户级限流
  * IP 级限流
  * 接口级限流

### 8. 缓存设计

#### 8.1 缓存层次

* **客户端缓存**
  * 浏览器缓存
  * App 本地缓存
* **CDN 缓存**
  * 静态资源
  * 边缘节点
* **服务端缓存**
  * 本地缓存（Caffeine、Guava）
  * 分布式缓存（Redis、Memcached）
* **数据库缓存**
  * Query Cache
  * Buffer Pool

#### 8.2 缓存更新

* **更新策略**
  * 先更新数据库，再删除缓存（推荐）
  * 先删除缓存，再更新数据库
  * 延迟双删
* **缓存预热**
  * 系统启动时加载热点数据
  * 定时任务刷新
* **缓存降级**
  * 缓存不可用时降级到数据库
  * 设置兜底数据

## 第三部分：常见系统设计 ⭐⭐⭐⭐⭐ 重点

### 9. 短链接系统

#### 9.1 功能需求

* 长链接转短链接
* 短链接跳转
* 访问统计

#### 9.2 设计要点

* **短链生成算法**
  * 哈希算法：MD5、MurmurHash
  * 自增 ID + Base62 编码
  * 冲突解决
* **存储设计**
  * KV 存储：短码 → 长链接
  * 索引：长链接 → 短码（去重）
* **性能优化**
  * 缓存热点短链接
  * 302 vs 301 跳转
  * CDN 加速
* **高可用设计**
  * 数据库主从
  * 缓存高可用
  * 限流防刷

#### 9.3 容量估算

* 日生成 100 万短链接
* 每个短链接 100 字节
* 读写比 100:1
* QPS 估算：写 12/s，读 1200/s

### 10. 新鲜事（Feed 流）系统

#### 10.1 功能需求

* 发布动态
* 查看关注人的动态（Timeline）
* 点赞、评论

#### 10.2 设计要点

* **推拉模式**
  * 推模式（Write Fanout）：写时扩散，读时聚合
    * 优点：读快
    * 缺点：写慢，存储大
    * 适用：粉丝少的用户
  * 拉模式（Read Fanout）：写时存储，读时聚合
    * 优点：写快，存储小
    * 缺点：读慢
    * 适用：粉丝多的用户（大 V）
  * 推拉结合：根据用户粉丝数选择策略
* **存储设计**
  * 动态表：存储动态内容
  * 关注关系表：用户 A 关注用户 B
  * 收件箱表（推模式）：用户 ID + 动态列表
* **性能优化**
  * 缓存：热点动态、用户 Timeline
  * 分页：游标分页
  * 异步：发布动态异步推送

### 11. 评论系统

#### 11.1 功能需求

* 发表评论
* 回复评论
* 点赞评论
* 查看评论列表

#### 11.2 设计要点

* **数据模型**
  * 评论表：评论 ID、内容、作者、时间、父评论 ID
  * 树形结构 vs 扁平结构
* **查询优化**
  * 按时间倒序：索引优化
  * 按热度排序：点赞数 + 时间衰减
  * 分页：深分页问题
* **审核机制**
  * 敏感词过滤
  * 人工审核
  * 用户举报

### 12. 秒杀系统

#### 12.1 特点

* 瞬时高并发
* 库存有限
* 读多写少

#### 12.2 设计要点

* **前端优化**
  * 页面静态化
  * 按钮置灰（倒计时）
  * 答题验证码（防止机器人）
* **后端优化**
  * 动静分离：静态资源 CDN
  * 限流：网关层、应用层
  * 削峰：消息队列
* **库存扣减**
  * Redis 预扣减：原子性
  * 数据库最终扣减：CAS 乐观锁
  * 防止超卖：库存校验
* **防刷策略**
  * 同一用户限制请求频率
  * IP 限流
  * 验证码

### 13. 搜索系统

#### 13.1 功能需求

* 关键词搜索
* 模糊匹配
* 搜索建议
* 排序

#### 13.2 设计要点

* **搜索引擎选型**
  * Elasticsearch：全文搜索
  * Solr：企业级搜索
* **索引设计**
  * 倒排索引
  * 分词策略
  * 索引更新：实时 vs 定时
* **查询优化**
  * 分页：from + size vs scroll vs search\_after
  * 高亮
  * 相关性排序：TF-IDF、BM25
* **搜索建议**
  * 前缀树（Trie）
  * 热门搜索词缓存

### 14. 排行榜系统

#### 14.1 功能需求

* 实时排行榜
* 历史排行榜
* 分时段排行榜（日榜、周榜、月榜）

#### 14.2 设计要点

* **实时排行榜**
  * Redis Sorted Set
  * ZINCRBY：增加分数
  * ZREVRANGE：获取排名
* **历史排行榜**
  * 定时任务固化到数据库
  * 按时间维度存储
* **性能优化**
  * 只展示 Top N
  * 分段排序：先分组再排序
  * 缓存结果

### 15. 分布式 ID 生成器

#### 15.1 设计要求

* 全局唯一
* 趋势递增
* 高性能
* 高可用

#### 15.2 设计方案

* **数据库自增 ID**
  * 优点：简单
  * 缺点：性能差、单点故障
* **UUID**
  * 优点：简单、性能高
  * 缺点：无序、占空间
* **雪花算法（Snowflake）**
  * 64 位：1 位符号 + 41 位时间戳 + 10 位机器 ID + 12 位序列号
  * 优点：趋势递增、高性能
  * 缺点：时钟回拨问题
* **美团 Leaf**
  * Leaf-segment：数据库号段模式
  * Leaf-snowflake：优化的雪花算法

## 第四部分：系统设计面试技巧

### 16. 面试流程 ⭐⭐⭐⭐⭐

#### 16.1 需求澄清（5 分钟）

* **功能需求**
  * 核心功能是什么
  * 用户如何使用
  * 边界条件
* **非功能需求**
  * QPS / TPS
  * 延迟要求
  * 一致性要求
  * 可用性要求

#### 16.2 容量估算（5 分钟）

* 用户规模：DAU、MAU
* QPS 估算：平均 QPS、峰值 QPS
* 存储估算：数据量、增长速度
* 带宽估算：上行、下行

#### 16.3 高层设计（10-15 分钟）

* **画出架构图**
  * 客户端
  * 负载均衡
  * 应用服务器
  * 缓存
  * 数据库
  * 消息队列
* **核心流程**
  * 读路径
  * 写路径
* **API 设计**
  * 核心接口

#### 16.4 详细设计（15-20 分钟）

* **深入某个组件**
  * 面试官感兴趣的部分
  * 技术难点
* **数据模型设计**
  * 表结构
  * 索引设计
* **算法设计**
  * 核心算法
  * 复杂度分析

#### 16.5 扩展讨论（5-10 分钟）

* **性能优化**
  * 缓存
  * 异步
  * 批量
* **可靠性**
  * 单点故障
  * 容错机制
* **可扩展性**
  * 如何扩展到 10 倍流量
  * 瓶颈在哪里
* **监控与运维**
  * 关键指标
  * 告警策略

### 17. 沟通技巧

#### 17.1 主动沟通

* 不要闷头设计
* 边画边说
* 及时确认理解

#### 17.2 结构化表达

* 先说整体再说细节
* 先说方案再说理由
* 先说结论再说过程

#### 17.3 权衡取舍

* 没有完美方案
* 说明优缺点
* 根据场景选择

#### 17.4 深度与广度

* 不要浅尝辄止
* 也不要过度设计
* 跟随面试官引导

### 18. 常见错误

#### 18.1 跳过需求澄清

* 直接开始设计
* 假设需求

#### 18.2 过度设计

* 一上来就微服务
* 过早优化

#### 18.3 缺少估算

* 不知道系统规模
* 无法验证设计合理性

#### 18.4 忽略非功能需求

* 只关注功能
* 不考虑性能、可用性

## 面试高频考点

### 必须掌握（⭐⭐⭐⭐⭐）

1. **高可用设计**
   * 如何消除单点故障
   * 负载均衡方案
   * 限流降级熔断
2. **高并发设计**
   * 缓存设计（穿透、击穿、雪崩）
   * 读写分离
   * 分库分表
3. **容量估算**
   * QPS 计算
   * 存储估算
   * 带宽估算
4. **缓存一致性**
   * 更新策略
   * 延迟双删
   * 订阅 Binlog
5. **分布式 ID**
   * 雪花算法
   * 时钟回拨问题
   * 号段模式

### 深入理解（⭐⭐⭐⭐）

6. **短链接系统**
   * 短码生成算法
   * 存储设计
   * 性能优化
7. **Feed 流系统**
   * 推拉模式
   * 存储设计
   * 性能优化
8. **秒杀系统**
   * 限流削峰
   * 库存扣减
   * 防止超卖
9. **一致性哈希**
   * 虚拟节点
   * 扩缩容
   * 应用场景
10. **数据库分片**
    * 分片策略
    * 跨库查询
    * 分布式事务

### 实战能力（⭐⭐⭐⭐⭐）

* 设计一个微信朋友圈
* 设计一个抖音短视频系统
* 设计一个电商秒杀系统
* 设计一个分布式限流器
* 设计一个 IM 即时通讯系统
* 设计一个推荐系统

## 学习路径

### 第一阶段：理论基础（2-3 周）

1. 高可用设计原则
2. 高并发设计原则
3. 可扩展性设计
4. 容量估算方法

### 第二阶段：核心技术（3-4 周）⭐ 重点

1. 缓存设计（重点）
2. 数据库优化（读写分离、分库分表）
3. 消息队列
4. 负载均衡

### 第三阶段：常见系统（4-5 周）⭐ 重点

1. 短链接系统
2. Feed 流系统
3. 评论系统
4. 秒杀系统
5. 搜索系统
6. 排行榜系统
7. 分布式 ID 生成器

### 第四阶段：面试准备（2-3 周）

1. 学习面试流程
2. 练习沟通技巧
3. Mock Interview
4. 总结常见问题

### 第五阶段：真题演练（持续）

1. LeetCode System Design
2. 《System Design Interview》练习题
3. YouTube 面经视频
4. 真实面试复盘

## 推荐学习资源

### 书籍

* 《System Design Interview - An Insider's Guide》 - Alex Xu（强烈推荐）
* 《设计数据密集型应用》（DDIA） - Martin Kleppmann
* 《大型网站技术架构》 - 李智慧

### 在线课程

* Grokking the System Design Interview（educative.io）
* System Design Primer（GitHub）
* ByteByteGo（YouTube）

### 网站资源

* [System Design Primer](https://github.com/donnemartin/system-design-primer)
* [Awesome System Design](https://github.com/madd86/awesome-system-design)
* [High Scalability Blog](http://highscalability.com/)

### 大厂技术博客

* 美团技术团队
* 阿里技术
* 字节跳动技术团队
* Netflix Tech Blog

## 学习建议

### 1. 理论与实践结合

* 学习理论知识
* 分析真实系统架构
* 动手实现小型系统
* 总结设计模式

### 2. 画图表达

* 架构图必须清晰
* 流程图表达清楚
* 数据流向明确
* 使用标准符号

### 3. 多看案例

* 大厂技术分享
* 开源项目架构
* 技术博客文章
* YouTube 系统设计视频

### 4. Mock 练习

* 找同学互相练习
* 限时完成设计
* 录音回听
* 总结改进

### 5. 建立知识库

* 整理常用组件
* 总结设计模板
* 记录容量估算公式
* 收集面试题目

***

**预计总学习时间**：12-16 周

**重点章节**：

* 缓存设计（第 8 章）
* 常见系统设计（第三部分）
* 面试技巧（第四部分）

**学习建议**：

1. 先理解核心原理，再学习具体系统
2. 每个系统都要自己画一遍架构图
3. 容量估算要反复练习
4. Mock Interview 至少 10 次以上

**面试技巧**：

1. 先澄清需求，不要急于设计
2. 容量估算不能省略
3. 从高层设计到详细设计
4. 主动沟通，确认理解
5. 权衡取舍，说明理由

系统设计能力是高级工程师的核心竞争力，加油！
