系统设计基础概念
系统设计面试不是让你设计 Google,而是考察你的思考框架。面试官想看你如何分解问题、分析权衡。
面试考察点
面试官通过这道题想考察:
1. 你是否有系统性的思考框架
2. 你是否能进行容量估算
3. 你是否能权衡利弊
4. 你是否有大规模系统的经验(哪怕是理论上的)
一、系统设计的思考框架
1.1 四步法(面试模板)
面试官追问:"你怎么设计一个系统?"
系统设计四步法:
Step 1: 需求澄清
- 明确功能范围
- 确认用户量级、QPS、数据量
- 确认性能要求(延迟、可用性)
Step 2: 高层设计
- 画出核心组件
- 确定数据流方向
- 识别关键挑战
Step 3: 详细设计
- 深入关键技术点
- 设计数据模型
- 选择存储方案
Step 4: 权衡讨论
- 讨论优缺点
- 备选方案
- 扩展性考虑
1.2 常见问题清单
面试中必须考虑的问题:
1. 用户量级?
- DAU(日活跃用户)是多少?
- 峰值并发是多少?
- 数据规模有多大?
2. 读写比例?
- 读多写少?用缓存
- 写多读少?用消息队列
- 各占一半?
3. 数据特性?
- 结构化还是非结构化?
- 需要事务吗?
- 需要排序/搜索吗?
4. 一致性要求?
- 强一致还是最终一致?
- 能容忍多少延迟?
二、容量估算
2.1 为什么要容量估算?
面试官追问:"你怎么估算需要多少服务器?"
容量估算是面试的重要环节:
目的:
1. 确定系统规模
2. 指导架构选择
3. 避免过度设计
估算原则:
- 用估算,不用精确计算
- 2 的幂次法则
- 简单算术即可
2.2 估算示例
估算 Twitter 的存储需求:
假设:
- 3 亿月活用户
- 每天 5 亿条推文
- 每条推文平均 140 字节
- 保留 3 年
计算:
- 每天存储:5 亿 × 140 字节 = 70 GB
- 3 年存储:70 GB × 365 × 3 ≈ 75 TB
这只是原始数据!
加上索引、备份、冗余:
- 索引开销:2-3 倍
- 备份:2-3 份
- 总计:75 TB × 6 ≈ 450 TB
结论:需要分布式存储
2.3 估算公式
常用估算公式:
存储容量 = 用户数 × 行为频率 × 数据大小 × 保留时间
带宽 = 用户数 × 行为频率 × 数据大小
QPS = 用户数 × 行为频率 / 时间
性能换算:
- 2^10 ≈ 10^3(K)
- 2^20 ≈ 10^6(M)
- 2^30 ≈ 10^9(G)
三、核心概念
3.1 扩展性(Scalability)
面试官追问:"什么是水平扩展和垂直扩展?"
垂直扩展(Scale Up):
- 升级单机硬件(更多 CPU、内存、磁盘)
- 简单,但有物理上限
- 存在单点故障
水平扩展(Scale Out):
- 增加更多机器
- 无理论上上限
- 更复杂,需要考虑数据分片
面试加分点:
"垂直扩展是省钱省力的短期方案,
水平扩展是长期发展方向"
3.2 负载均衡
为什么要负载均衡?
- 分散请求到多台服务器
- 提高系统吞吐量
- 实现高可用
常见负载均衡算法:
1. 轮询(Round Robin)
- 依次分发请求
- 简单,但不考虑服务器负载
2. 最少连接(Least Connections)
- 发给当前连接最少的服务器
- 适合请求处理时间相近的场景
3. IP 哈希(IP Hash)
- 相同 IP 的请求发到同一服务器
- 适合需要会话粘性的场景
3.3 缓存
为什么用缓存?
- 减少数据库压力
- 加快响应速度
- 提高系统吞吐量
缓存层次:
1. 浏览器缓存(CDN)
2. 反向代理缓存
3. 应用缓存(Redis)
4. 数据库缓存
面试能加分的回答:
"缓存的本质是用空间换时间,
但要注意缓存雪崩、击穿、穿透问题"
四、面试总结
系统设计核心要点
┌─────────────────────────────────────────────────┐
│ 系统设计框架 │
├─────────────────────────────────────────────────┤
│ │
│ 四步法: │
│ 1. 需求澄清 → 确定规模和性能要求 │
│ 2. 高层设计 → 画出核心组件 │
│ 3. 详细设计 → 深入关键技术 │
│ 4. 权衡讨论 → 讨论优缺点 │
│ │
│ 容量估算: │
│ - 存储、带宽、QPS │
│ - 2 的幂次法则 │
│ │
│ 核心概念: │
│ - 扩展性(水平 vs 垂直) │
│ - 负载均衡 │
│ - 缓存 │
│ │
└─────────────────────────────────────────────────┘
面试能加分的回答
1. 能系统性地思考
"我会从需求澄清开始,明确规模和性能要求"
2. 能进行容量估算
"先估算存储和带宽需求,再反推架构"
3. 能权衡利弊
"这个方案的优势是 X,但缺点是 Y,可以用 Z 来缓解"