跳转至

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,根据业务决定

速查表

常用数字记忆:
  1GB = 10^9 字节
  1TB = 10^12 字节
  1年 ≈ 3.15 × 10^7 秒
  1天 = 86400 秒
  内存访问 ≈ 100ns
  SSD随机读 ≈ 100μs
  HDD随机读 ≈ 10ms
  网络同机房 ≈ 0.5ms
  跨城网络 ≈ 30ms

高可用:
  99.9%   → 年停机 8.7小时
  99.99%  → 年停机 52分钟
  99.999% → 年停机 5.26分钟