系统设计面试框架(面向资深工程师)
结论先行:系统设计面试考的不是"背架构",而是结构化沟通 + 权衡决策。面试官想看你能否把模糊需求变成可落地、可扩展、有取舍依据的设计。用固定框架,把 45 分钟走稳。
相关阅读:技术面试英语、Remote / 海外求职策略、转型 AI 的职业路径。
0. 45 分钟时间盒
| 阶段 | 时长 | 产出 |
|---|---|---|
| 需求澄清 | 5' | 功能/非功能边界 |
| 容量估算 | 5' | QPS、存储、带宽 |
| 接口 & 数据模型 | 5' | API、核心表/实体 |
| 高层架构 | 10' | 组件图 + 数据流 |
| 深挖 1–2 个点 | 15' | 瓶颈的具体方案 |
| 权衡 & 收尾 | 5' | 取舍、演进、监控 |
1. 需求澄清(别急着画图)
- 功能需求:核心用例是什么?先聚焦 1–2 个(如"发短链/取短链")。
- 非功能需求:规模(DAU/QPS)、读写比、延迟目标、一致性要求、可用性目标。
- 明确 Out of Scope:主动砍掉次要功能,聚焦深度。
一句话确认:"我先做 X 和 Y,先不做 Z,规模按 N 级 DAU、读多写少、强调低延迟——对吗?"
2. 容量估算(Back-of-envelope)
练熟这几个换算:
- 1 天 ≈ 86,400 ≈ 10^5 秒。
- QPS = 日请求数 / 10^5;峰值 ≈ 平均 × 2–5。
- 存储 = 记录数 × 单条大小;估读/写 QPS、带宽、缓存容量。
例:1 亿 DAU、人均 10 次读 → 10^9/天 ≈ 万级 QPS,峰值几万。据此决定是否需要缓存/分片。
3. 接口 & 数据模型
- 定义少量核心 API(REST/gRPC):入参、出参、错误。
- 核心实体与关键索引;选 SQL 还是 NoSQL 说清理由(事务/关系 vs 海量 KV/水平扩展)。
4. 高层架构(画数据流)
标准骨架,按需增删:
Client → CDN → LB → API Gateway → Service(s)
│
┌───────────────┼───────────────┐
Cache DB(主从/分片) 消息队列
(Redis) (Kafka)
│
异步 Worker
先画能跑通的最简版,再逐步加缓存、队列、副本。
5. 深挖(面试真正的分水岭)
面试官会挑一点让你深入。常见方向与武器:
- 扩展性:水平扩容、无状态服务、分片/分区(一致性哈希)、读写分离。
- 缓存:缓存策略(Cache-aside)、失效、雪崩/穿透/击穿、热点 key。
- 数据库:主从复制、分库分表、索引、CAP 取舍、最终一致 vs 强一致。
- 异步与削峰:消息队列、幂等消费、重试与死信、Outbox 模式。
- 高可用:多副本、故障转移、限流/熔断/降级、超时与重试预算。
- 一致性:分布式事务替代方案(Saga、TCC)、幂等键。
6. 高频组件速查
| 需求 | 常用方案 |
|---|---|
| 全局唯一 ID | Snowflake、号段、UUID |
| 限流 | 令牌桶 / 漏桶、滑动窗口 |
| 排行榜/热点 | Redis ZSet |
| 全文检索 | 倒排索引 / Elasticsearch |
| 近实时计数 | HyperLogLog、Count-Min Sketch |
| 地理临近 | Geohash、QuadTree |
| Feed/时间线 | 推(写扩散)/拉(读扩散)/混合 |
7. 权衡与收尾
- 明确讲取舍:"选最终一致换可用性,因为业务能容忍秒级延迟。"
- 指出瓶颈与演进路径:现在够用,量再大 10× 时先动哪块。
- 补一句可观测性:关键指标、告警、SLO。这体现资深度。
8. 常见陷阱
- 不澄清就开画 → 做错方向。
- 一上来堆一堆中间件炫技,却讲不清为什么。
- 只画框图不谈数据流与失败路径。
- 不给数字(容量、延迟)→ 决策没依据。
- 沉默思考 → 面试是沟通题,边想边说(用英语时尤其要练,见 技术面试英语)。
小结
把框架背到肌肉记忆:澄清 → 估算 → 接口/模型 → 高层 → 深挖 → 权衡。剩下的就是用几个经典题(短链、Feed、聊天、限流、支付、通知)反复演练,直到能用英语从容主导 45 分钟。