539_系统设计面试方法论¶
一句话说明¶
系统设计面试考查候选人在模糊需求下,有条理地设计可扩展、高可用系统的能力。
核心知识点¶
SNAKE 框架(五步法)¶
S - Scope 需求澄清(功能/非功能需求)
N - Numbers 容量估算(QPS/存储/带宽)
A - API 接口设计
K - Kernel 核心架构设计
E - Extend 深入扩展(瓶颈/优化/权衡)
步骤详解¶
Step 1:需求澄清(5分钟) - 功能需求:这个系统要做什么?用户是谁? - 非功能需求:可用性(99.9%?)、一致性(强/最终)、延迟(<100ms?) - 规模:DAU多少?写读比例?
Step 2:容量估算(5分钟)
DAU = 1亿,每人每天10次请求
QPS = 1亿 × 10 / 86400 ≈ 11,574 QPS
峰值 QPS = 平均 × 3 ≈ 35,000 QPS
存储:每条记录1KB,每天1亿条 → 100GB/天
5年 = 100GB × 365 × 5 ≈ 180TB
Step 3:API 设计 - RESTful 风格,明确 HTTP 动词 - 入参/出参结构
Step 4:核心架构 - 画图!先画高层架构,再细化关键组件 - 识别瓶颈:哪个服务最重要?
Step 5:深入扩展 - 面试官会追问:数据库如何扩展?如何处理热点数据?
实战代码/设计图/模板¶
高层架构图(ASCII)¶
用户
│
▼
[DNS] → [CDN/静态资源]
│
▼
[负载均衡 LB]
│
├──▶ [Web服务集群]
│ │
│ [缓存层 Redis]
│ │
└──▶ [数据库主从集群]
│
[主库Write] [从库Read]
│
[消息队列 MQ]
│
[异步Worker集群]
│
[对象存储 OSS/S3]
容量估算模板¶
# 快速估算模板
DAU = 1_000_000 # 日活用户数
req_per_user = 10 # 每用户每天请求数
total_req_per_day = DAU * req_per_user
avg_qps = total_req_per_day / 86400
peak_qps = avg_qps * 3 # 峰值是平均的3倍
# 存储估算
record_size_kb = 1 # 每条记录大小
daily_records = 1_000_000
daily_storage_gb = record_size_kb * daily_records / (1024**2)
yearly_storage_tb = daily_storage_gb * 365 / 1024
print(f"平均 QPS: {avg_qps:.0f}")
print(f"峰值 QPS: {peak_qps:.0f}")
print(f"每日存储: {daily_storage_gb:.2f} GB")
print(f"每年存储: {yearly_storage_tb:.2f} TB")
面试常问点¶
| 问题 | 参考答案 |
|---|---|
| 如何保证高可用? | 多副本、主从切换、熔断降级 |
| 如何处理热点数据? | 本地缓存、一致性哈希、限流 |
| 数据一致性如何保证? | 分布式事务、BASE理论、saga模式 |
| 如何扩展到10倍流量? | 水平扩展、数据库分片、读写分离 |
| CAP定理如何权衡? | CP vs AP,根据业务决定 |