知识体系大纲

第一部分:系统设计原则

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

    • 雪花算法

    • 时钟回拨问题

    • 号段模式

深入理解(⭐⭐⭐⭐)

  1. 短链接系统

    • 短码生成算法

    • 存储设计

    • 性能优化

  2. Feed 流系统

    • 推拉模式

    • 存储设计

    • 性能优化

  3. 秒杀系统

    • 限流削峰

    • 库存扣减

    • 防止超卖

  4. 一致性哈希

    • 虚拟节点

    • 扩缩容

    • 应用场景

  5. 数据库分片

    • 分片策略

    • 跨库查询

    • 分布式事务

实战能力(⭐⭐⭐⭐⭐)

  • 设计一个微信朋友圈

  • 设计一个抖音短视频系统

  • 设计一个电商秒杀系统

  • 设计一个分布式限流器

  • 设计一个 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)

网站资源

大厂技术博客

  • 美团技术团队

  • 阿里技术

  • 字节跳动技术团队

  • 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. 权衡取舍,说明理由

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

Last updated