系统设计面试指南 2026:高频题、架构模板、评分标准与准备路线
系统设计面试System Design Interview系统设计面试题systemdesigninterviewprep架构设计FAANG

系统设计面试指南 2026:高频题、架构模板、评分标准与准备路线

45–60 分钟系统设计面试怎么讲?用 5 步框架拆解需求、API、数据模型、容量估算与取舍,配合短链、限流、聊天等高频题和通知系统示例,区分 L4/L5 与 Senior 的准备重点。

Sam · · 19 分钟阅读

快速答案:系统设计面试怎么准备

系统设计面试的核心不是背架构图,而是在 45-60 分钟里稳定展示 5 个信号:需求澄清、API 和数据模型、关键路径设计、扩展性与故障处理、trade-off 总结。对 L4/L5 候选人,面试官主要看你能不能把常见系统设计面试题讲完整;对 Senior / Staff 候选人,面试官会继续追问一致性、容量估算、热点、降级、可观测性和长期演进。

如果你正在准备 system design interview,最有效的路线是先掌握通用框架,再用高频题反复训练:

高频系统设计面试题主要考点详细解析
URL 短链系统API、ID 生成、缓存、重定向、热点设计 URL Shortener
Rate Limitertoken bucket、分布式限流、Redis、精度权衡设计 Rate Limiter
Chat SystemWebSocket、消息存储、在线状态、推送设计聊天系统
Twitter / Feedfanout、timeline cache、名人用户、排序设计信息流
Search Engineindex、crawler、ranking、倒排索引设计搜索系统
Recommendation System召回、排序、特征、A/B testing推荐系统架构面试题
Distributed File SystemHDFS/GFS、NameNode、block、副本、容错Hadoop 分布式文件系统面试题

如果你需要真实面试节奏的反馈,可以看 System Design Mock Interview。这页更适合作为系统设计知识地图,mock 更适合定位表达和 trade-off 短板。

系统设计面试是技术面试中最能体现工程成熟度的环节。与编码面试不同,它没有标准答案——面试官考察的是你的思维过程、权衡取舍和沟通能力。

无论你是准备中级(L4/L5)还是高级(L6+)岗位,这篇指南将帮你建立系统化的回答框架。

什么是系统设计面试?

系统设计面试要求你设计一个可扩展、高可用的分布式系统。常见的题目包括:

  • 设计 URL 短链服务(TinyURL)
  • 设计 Twitter/微博信息流
  • 设计分布式文件系统
  • 设计实时聊天系统
  • 设计速率限制器(Rate Limiter)

不同级别的要求差异

初级工程师(L3/L4):

  • 重点:API 设计、数据模型、基础架构
  • 不要求深入的扩展性分析
  • 能识别基本的设计模式即可

中级工程师(L4/L5):

  • 重点:扩展性、容错性、trade-offs
  • 需要讨论数据库分片、缓存策略、负载均衡
  • 能解释为什么选择某个方案而非另一个

高级工程师(L6+):

  • 重点:系统边界、跨团队协作、长期演进
  • 需要讨论一致性模型、分布式事务、多活架构
  • 能识别潜在的单体故障点并提出解决方案

提示: 面试级别由 Hiring Manager 决定。如果你不确定,可以在面试开始时问:“您希望我以初级、中级还是高级的视角来设计这个系统?“

面试官在评估什么?

系统设计面试不是看你是否给出了”正确答案”,而是看你的思考过程。面试官通常从以下维度评分:

1. 需求澄清与范围定义(20%)

优秀的候选人:

  • 主动提问明确需求(用户规模、QPS、数据量、功能优先级)
  • 区分 Must-have 和 Nice-to-have 功能
  • 定义明确的系统边界

需要改进的候选人:

  • 直接开始画图,不确认需求
  • 试图一次性实现所有功能
  • 忽略非功能性需求(可用性、延迟、一致性)

2. 高层设计与 API 设计(20%)

优秀的候选人:

  • 先画高层架构图(客户端、负载均衡、服务层、数据层)
  • 定义清晰的 API 接口(RESTful 或 RPC)
  • 组件职责分明,符合单一职责原则

需要改进的候选人:

  • 跳过高层设计,直接陷入细节
  • API 设计过于复杂或过于简单
  • 组件之间耦合度过高

3. 核心组件设计(25%)

优秀的候选人:

  • 详细设计关键路径(如写请求如何从客户端到存储)
  • 选择合适的数据结构(关系型 vs 非关系型数据库)
  • 考虑数据一致性、缓存策略、消息队列

需要改进的候选人:

  • 只设计读路径,忽略写路径
  • 数据库选择不当(如用 SQL 存储时序数据)
  • 没有处理并发和冲突

4. 扩展性与容错(20%)

优秀的候选人:

  • 识别瓶颈并提出解决方案(分片、复制、缓存)
  • 讨论故障转移、负载均衡、熔断机制
  • 能进行容量规划(服务器数量、存储需求)

需要改进的候选人:

  • 假设系统永远不崩溃
  • 没有考虑单点故障
  • 无法估算系统规模

5. 权衡取舍与总结(15%)

优秀的候选人:

  • 主动讨论 trade-offs(如一致性 vs 可用性)
  • 提出替代方案并解释为什么选择当前方案
  • 总结设计并识别可能的改进方向

需要改进的候选人:

  • 认为自己的设计是完美的
  • 无法解释为什么不用其他方案
  • 忽略安全、监控、可观测性

万能回答框架:5 步法

这套框架适用于任何系统设计题目。按照这个流程走,即使你对某个领域不熟悉,也能展现出结构化的思维。

第 1 步:澄清需求(5-7 分钟)

必须问的问题:

功能需求:

  • “这个系统的核心功能是什么?”
  • “用户需要读多还是写多?”
  • “需要支持实时性吗?”
  • “有什么特殊的业务规则?”

规模估算:

  • “预期有多少 DAU/MAU?”
  • “QPS 大概是多少?”
  • “数据量有多大?(每天新增多少)”
  • “存储需求是多少?”

非功能需求:

  • “可用性要求是多少?(99%、99.9%、99.99%)”
  • “延迟要求是多少?”
  • “数据一致性要求是什么?”

示例对话:

面试官: 请设计 Twitter 信息流。

你: 好的,我先澄清一下需求:

  1. 是设计”发布推文”还是”拉取信息流”,还是两者都要?
  2. 信息流是按时间顺序还是按算法推荐?
  3. 需要支持媒体内容(图片、视频)吗?
  4. 预期的用户规模和 QPS 是多少?

面试官: 先聚焦”拉取信息流”,时间顺序,纯文本,1 亿 DAU,读多写少。

你: 好的,所以我需要设计一个高并发的读系统,支持按时间顺序获取关注用户的推文。

第 2 步:高层设计(5-7 分钟)

画出系统的核心组件:

客户端 → 负载均衡器 → API 网关 → 服务层 → 数据存储
                            ↓
                       缓存层
                            ↓
                       消息队列

关键决策:

  1. 客户端类型:Web、iOS、Android?
  2. 网络协议:HTTP/HTTPS、WebSocket、gRPC?
  3. 架构风格:微服务 vs 单体?REST vs GraphQL?
  4. 数据流向:请求如何从入口到存储再返回?

第 3 步:核心组件详细设计(15-20 分钟)

选择 1-2 个核心组件深入设计:

数据模型:

-- 用户表
Users(user_id, username, email, created_at)

-- 推文表
Tweets(tweet_id, user_id, content, created_at)

-- 关注关系
Follows(follower_id, followee_id, created_at)

API 设计:

GET /api/v1/feed?user_id=123&since_id=456&limit=20
POST /api/v1/tweets
GET /api/v1/users/123/tweets

关键路径分析:

  • 用户请求信息流 → 负载均衡 → Feed Service → 缓存/数据库 → 返回
  • 用户发布推文 → 负载均衡 → Tweet Service → 数据库 → 消息队列 → 更新粉丝信息流

第 4 步:扩展性与优化(10 分钟)

识别瓶颈并提出解决方案:

瓶颈 1:数据库读写压力

  • 方案:读写分离、缓存热点数据、数据库分片

瓶颈 2:单点故障

  • 方案:多副本、负载均衡、健康检查

瓶颈 3:数据一致性

  • 方案:最终一致性、版本号、冲突解决策略

容量估算:

  • 假设每条约 140 字节,1 亿用户每天发 5 条 → 每天 5 亿条约 70GB
  • 假设信息流平均 20 条,每次请求 2.8KB,每秒 10 万 QPS → 280MB/s 带宽

第 5 步:总结与权衡(3-5 分钟)

总结你的设计: “我设计了一个包含 API 网关、Feed Service、缓存层和数据库的信息流系统。读请求优先查缓存,写请求通过消息队列异步更新粉丝信息流。”

讨论 trade-offs:

  • “我选择了推模型(写时更新粉丝信息流),优点是读延迟低,缺点是写放大。如果用户粉丝数极多(如名人),可以改用拉模型或混合模型。”
  • “缓存策略选择了 TTL + LRU,但没有处理缓存穿透/雪崩问题,可以加布隆过滤器和随机过期时间。”

提出改进方向:

  • “可以加入 CDN 加速静态资源”
  • “可以加入监控和告警系统”
  • “可以考虑多地域部署以降低延迟”

完整答题示范:设计一个通知系统(Notification System)

前面 5 步法里散落着不同题目的片段示例(Twitter 信息流对话、feed 数据模型、推文容量估算)。这一节换一个能把 5 步串起来的场景——设计一个通知系统——从头到尾走一遍完整答题流程。真实面试里,面试官会一直追问,你能沿同一个场景把每一步讲下去,比背 10 个孤立片段更有说服力。

小节导航(锚点可直接跳转):

评分口径说明: 本文的评分建议(各维度权重、“优秀/需要改进”的描述)是基于公开面经整理的本站参考口径,不是任何一家公司的官方评分标准;各公司官方标准不对外公开,请以面试官当场给出的要求为准。

示范 · 第 1 步:需求与边界(5-7 分钟)

先和面试官确认范围,把题面收敛到一个可设计的规模:

功能需求(Must-have):

  • 用户触发事件(如:订单状态变更、评论被回复)后,系统按用户偏好发送通知
  • 通知渠道:站内信(in-app)+ 邮件;推送(push)作为 Nice-to-have 留到扩展阶段
  • 用户可管理偏好:按渠道、按事件类型开关(“不再接收促销邮件”)
  • 通知保留 90 天,可标记已读

非功能需求:

  • 可用性 99.9%(每年约 8.76 小时不可用预算:365 × 24 × 0.001)
  • 延迟:站内信 P95 < 2 分钟(用户打开 App 时能看到);邮件分钟级、小时级可接受
  • 一致性:通知不能丢(at-least-once 语义),重复一次可接受,丢失不可接受

边界(明确不做什么):

  • 不做短信/电话渠道、不做模板编辑器、不做多租户隔离——这些留给 follow-up 讨论

面试提示:边界不是”我不会做”,而是”这一轮 45 分钟我先把这条路径做完整”。主动划边界本身就是评分项。

示范 · 第 2 步:容量估算(2-3 分钟,数字必须可复算)

所有假设先写在白板上,面试官可以直接用同一组数字验算你的结论:

假设取值单位
DAU10,000,000人/天
人均触发通知10条/人/天
总通知量10,000,000 × 10 = 1.0×10⁸条/天
峰值系数×10倍(1.0×10⁸/86400 ≈ 1157/s → 峰值 ≈ 11,570/s,取整 10,000/s)
站内信占比100%(所有通知都落库)—
邮件占比50%(10,000,000 × 10 × 0.5 = 5×10⁷ 封/天,均值 ≈ 579 封/s)—
单条通知大小≈ 0.5 KB(JSON 正文 + 元数据,含冗余按 1 KB 计)—
日增存储1.0×10⁸ × 1 KB ≈ 100 GB/天;保留 90 天 ≈ 9 TB—
站内信读 QPS10,000,000 人 × 20 次打开/天 = 2×10⁸ 次/天 ≈ 2315 次/s,峰值 ≈ 10,000/s—

复算检查点: 1157/s 均值 × 10 倍峰值系数 = 11,570/s ≈ 1 万/s——如果你的结论(“按 1 万 QPS 设计”)和这行对不上,说明中间某步算错了。面试里把这张表讲出来,容量估算这一步基本就拿满了。

示范 · 第 3 步:API 与数据模型(5-7 分钟)

API 设计:

# 发送入口(内部服务调用)
POST /api/v1/notify
  { "user_id": 123, "event_type": "order.shipped",
    "payload": {"order_id": 456}, "channels": ["inapp", "email"] }
  → 202 Accepted { "notification_id": "ntf_..." }

# 用户侧
GET    /api/v1/notifications?cursor=<opaque>&limit=20   # 游标分页,返回未读优先
POST   /api/v1/notifications/{id}/read
GET    /api/v1/notification-preferences
  → { "order.shipped": {"inapp": true, "email": true, "push": false},
      "marketing":     {"inapp": true, "email": false, "push": false} }
PUT    /api/v1/notification-preferences
  { "order.shipped": {"inapp": true, "email": true, "push": false} }
  → 204(只 upsert 指定的 event_type,同一用户其他 event_type 不受影响)

设计点:发送入口返回 202(异步受理),调用方不等待邮件真正发出;读取用不透明游标(opaque cursor)而不是 offset,避免深分页。偏好按 event_type 局部更新(关 marketing 邮件不影响 order 邮件),与下面 Preferences 的复合主键一一对应。

数据模型:

-- 通知主体(写多读多,按 user_id 分片)
Notifications(notification_id PK, user_id, event_type,
              title, body, channels, status,
              read_at, created_at, expires_at)
-- 索引:(user_id, created_at DESC) 支持"最近 N 条"

-- 偏好(读多写少,每用户每事件类型一行)
Preferences(user_id, event_type, inapp, email, push, updated_at,
            PRIMARY KEY (user_id, event_type))
-- 为什么复合主键:user_id 单列 PK 只允许一个用户有一行,即只能存一种 event_type;
-- 用户同时设置 marketing 和 order 两类偏好时,第二次 INSERT 会撞
-- "UNIQUE constraint failed: Preferences.user_id"。(user_id, event_type) 复合主键
-- 让同一用户的每类偏好各占一行,可独立 upsert 与查询,与上面的 PUT 语义一致。

-- 邮件发送任务(独立库,支撑重试)
EmailJobs(job_id PK, notification_id, state, attempts, next_retry_at, last_error)

示范 · 第 4 步:架构与关键路径(15-20 分钟)

业务服务(订单/评论/…)
    │ ① 发事件
    ▼
Kafka  (topic: notify.events, 按 user_id 分区)
    │ ② 消费
    ▼
通知服务 (无状态, 多副本)
    │  查偏好 → 落 Notifications 库(分片)
    ├─ 站内信:立即可读(关键路径终点)
    └─ 邮件:写 EmailJobs → 邮件 worker 池 → SMTP 网关 → 外部邮箱

关键路径: 事件 → Kafka → 通知服务落库 → 用户打开 App 读到。邮件是旁路:SMTP 挂了不阻塞站内信,只影响邮件渠道。

关键决策点(每处都给出理由):

  • 为什么用 Kafka 而不是直接 RPC 调用通知服务: 业务服务(订单、评论、营销)是多个生产者,MQ 解耦后通知服务扩容不影响业务服务;Kafka 按 user_id 分区保证同一用户的通知有序,且业务服务宕机时事件不丢。
  • 为什么 Notifications 按 user_id 分片: 99% 的查询是”某用户的最近 N 条”,按 user_id 分片让每个用户的完整时间线落在一个分片,读路径无需跨片聚合;100 GB/天 × 90 天 = 9 TB,按 100 个分片每片约 90 GB,单机可承载。
  • 邮件 worker 池为什么独立: 外部 SMTP 的延迟和故障不可控,独立 worker 池可以单独限流、重试、扩容,故障域与站内信隔离。

示范 · 第 5 步:失败场景与降级(5-10 分钟)

故障场景影响处理方案
通知服务副本挂掉事件消费暂停无状态,K8s 自动拉起;Kafka 消费位点(offset)持久化,重启后从断点继续,不丢事件
Kafka 某分区 leader 挂该用户的事件短暂不可消费分区副本(replication factor = 3)自动切换 leader;秒级恢复
SMTP 网关故障邮件渠道中断,站内信不受影响worker 指数退避重试(1s/4s/16s…上限 1 小时);连续失败告警 + 切换备用 SMTP;90 天内的任务可整体重放
Notifications 某个分片库挂该分片用户的站内信读/写不可用主从复制 + 自动 failover;期间写路径继续消费 Kafka 并写入 WAL,failover 后补写——宁可短暂乱序,不丢通知
偏好服务挂无法判断用户是否关闭了某渠道缓存最近一次偏好(TTL 10 分钟);缓存也失效时降级为”只发站内信、不发邮件”(保守降级:宁少发,不误发营销类通知)

可观测性: 三个核心指标——事件到落库的端到端延迟(P95 < 2 分钟,对应第 1 步的 SLA)、邮件投递成功率、各队列积压深度(lag)。积压深度是”系统开始过载”的最早信号。

示范 · Trade-off 总结(3-5 分钟)

面试最后 3 分钟,主动把做过的取舍摆出来,这是评分权重最高也最容易被忽略的一步:

取舍 1:at-least-once 投递 + 幂等消费,而不是 exactly-once。 先把语义说清楚:at-least-once 意味着事件可能被重复投递,允许重复是前提。但”幂等”不是天然成立的——“同一通知发两遍用户只是多看到一次”恰恰是我们要避免的重复副作用,不能作为幂等的证明。真正的幂等需要三件套:

  1. 稳定的事件标识(idempotency key):生产者在发事件前生成(如 order:456:shipped = {业务}:{业务ID}:{事件类型}),调用方重试时复用同一个 key,而不是重新生成。API 层的 POST /notify 可以要求调用方在 header 里传 Idempotency-Key,未传时由事件内容派生。
  2. 数据库唯一约束 + 处理状态:Notifications 上建 event_key 唯一索引(或独立的 EventDedup(event_key PK, notification_id, state) 表),消费时 INSERT ... ON CONFLICT DO NOTHING——插入失败即说明该事件已处理过,直接返回已有 notification_id,不再落新记录。
  3. 处理状态机:pending → sent → confirmed 只允许向前推进,重放时按状态决定跳过还是补做。 这样站内记录是幂等的:同一事件被消费 10 次也只会产生一条 Notifications 记录。 但必须划清边界:站内记录的去重 ≠ 外部邮件发送的去重。SMTP 没有原生的幂等机制,EmailJobs 的重试序列存在经典边界——SMTP 服务器实际已接受邮件(收件人会收到),但 250 响应包丢失,worker 超时判为失败并重试,于是同一封邮件被真实发出两次:站内只有一条记录,外部却产生了重复副作用。所以完整表述是:站内通知”恰好一条记录”(幂等),邮件渠道”at-least-once、不去重”;若必须防外部重复,只能借助 Message-ID 让邮件客户端/ESP 尽力去重(无强保证),或把营销类邮件改为可撤回的发送确认流。面试里主动把这条边界讲出来——“幂等只覆盖到我自己的库,外部副作用另算”——比笼统说”我们用 notification_id 去重”更能体现对分布式语义的理解。

取舍 2:user_id 哈希分片,而不是按时间分片。 按时间分片写扩展简单(新分片承接新数据),但”某用户最近 N 条”查询要跨所有分片聚合;按 user_id 哈希分片读路径最干净,代价是数据倾斜处理(超大用户/机器人账号需要二级打散)和扩容时的 rehash(可用一致性哈希或虚拟节点缓解)。通知系统是读多写少、查询全部带 user_id,所以选 user_id。

如果还有 5 分钟(follow-up 方向): 名人/超大用户场景(一个事件要通知 100 万粉丝)如何防止单分区热点;推送渠道加入后与邮件的优先级去重;多 region 部署时通知的地理路由。

本站练习建议(非任何公司官方标准)

  • 完整走一遍: 用 45 分钟按上面 6 个小节顺序,把通知系统完整讲一遍(出声,不是默读);讲不出来的小节就是你下一周的练习重点。
  • 换场景复练: 同一套 5 步框架套到 Twitter 信息流、URL 短链 上各练一次,重点对比”容量估算表”和”失败场景表”的差异。
  • 录音回放: 回放时只问三个问题——每步是否先说了结论再展开?数字是否都能从白板的假设复算出来?trade-off 是否至少主动提了两处?

核心知识点速查

系统设计面试涉及的知识面很广。以下是必须掌握的核心概念:

网络与协议

  • HTTP/HTTPS:请求/响应模型、状态码、头信息
  • TCP vs UDP:可靠性、延迟、适用场景
  • DNS:域名解析过程、CDN 与 DNS 的关系
  • WebSocket:双向通信、实时应用
  • gRPC:高性能 RPC、Protobuf 序列化

数据库

关系型数据库(SQL):

  • MySQL、PostgreSQL
  • ACID 事务、索引、查询优化
  • 适用场景:强一致性、复杂查询、事务处理

非关系型数据库(NoSQL):

  • Key-Value:Redis、Memcached(缓存、会话)
  • Document:MongoDB、Cassandra(灵活 schema、高写吞吐)
  • Column-Family:Cassandra、HBase(时序数据、大数据)
  • Graph:Neo4j(社交网络、推荐系统)

数据库扩展策略:

  • 读写分离:主库写,从库读
  • 分片(Sharding):按用户 ID、时间、地理位置分片
  • 复制(Replication):主从复制、多主复制
  • 分区(Partitioning):范围分区、哈希分区

缓存

缓存策略:

  • Cache-Aside:应用负责读写缓存(最常用)
  • Write-Through:写缓存同时写数据库
  • Write-Behind:先写缓存,异步写数据库
  • Read-Through:缓存负责从数据库加载数据

缓存问题与解决方案:

  • 缓存穿透:布隆过滤器、缓存空值
  • 缓存击穿:互斥锁、逻辑过期
  • 缓存雪崩:随机 TTL、多级缓存

缓存层级:

  • L1:客户端缓存(浏览器、App)
  • L2:CDN 缓存(静态资源)
  • L3:分布式缓存(Redis Cluster)
  • L4:数据库查询缓存

负载均衡

算法:

  • 轮询(Round Robin)
  • 加权轮询(Weighted Round Robin)
  • 最少连接(Least Connections)
  • IP 哈希(IP Hash)

类型:

  • L4 负载均衡:传输层(TCP/UDP),Nginx、HAProxy
  • L7 负载均衡:应用层(HTTP),支持路由、重写、限流

消息队列

适用场景:

  • 异步处理(发邮件、发短信)
  • 解耦服务(生产者不依赖消费者)
  • 流量削峰(秒杀、促销活动)
  • 事件驱动架构

常见系统:

  • Kafka:高吞吐、持久化、分区复制
  • RabbitMQ:灵活路由、ACK 机制
  • Redis Streams:轻量级、多消费者组

微服务架构

服务拆分原则:

  • 按业务领域拆分(DDD)
  • 单一职责
  • 独立部署、独立数据库

服务通信:

  • 同步:REST、gRPC
  • 异步:消息队列、事件总线

服务治理:

  • 服务注册与发现(Consul、Eureka)
  • 熔断器(Hystrix、Resilience4j)
  • 链路追踪(Jaeger、Zipkin)
  • API 网关(Kong、Apigee)

分布式系统

CAP 定理:

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容错性(Partition tolerance)
  • 只能选两个

一致性模型:

  • 强一致性:读最新写(如银行转账)
  • 最终一致性: eventually consistent(如社交网络)
  • 会话一致性:同一会话内一致

分布式共识:

  • Paxos、Raft(分布式领导选举)
  • 分布式锁(Redis Redlock、ZooKeeper)

分布式事务:

  • 2PC(两阶段提交)
  • Saga 模式
  • TCC(Try-Confirm-Cancel)

安全与可观测性

安全:

  • HTTPS/TLS 加密
  • 身份认证(OAuth 2.0、JWT)
  • 授权(RBAC、ABAC)
  • 输入验证、SQL 注入防护
  • DDoS 防护、速率限制

可观测性:

  • 日志:ELK Stack(Elasticsearch、Logstash、Kibana)
  • 指标:Prometheus + Grafana
  • 链路追踪:Jaeger、Zipkin
  • 告警:PagerDuty、Opsgenie

高频题目索引

这一节是本站系统设计内容的导航入口:每道题有独立的深度解析,公司面经、Senior 专项和数据方向的系统设计也都从这里进入。

入门级

  • 设计 URL 短链服务 — 深度解析

    • 考点:哈希算法、重定向、统计计数
    • 难度:★★
  • 设计 Rate Limiter(速率限制器) — 深度解析

    • 考点:算法选择(令牌桶、漏桶)、分布式计数
    • 难度:★★

进阶级

  • 设计 Twitter/微博信息流 — 深度解析

    • 考点:推拉模型、缓存策略、写放大
    • 难度:★★★
  • 设计实时聊天系统 — 深度解析

    • 考点:WebSocket、消息持久化、离线消息
    • 难度:★★★
  • 设计分布式文件系统 — 深度解析

    • 考点:分块存储、元数据管理、一致性
    • 难度:★★★★

高级

  • 设计推荐系统 — 深度解析

    • 考点:协同过滤、特征工程、实时推荐
    • 难度:★★★★
  • 设计搜索引擎 — 深度解析

    • 考点:倒排索引、分词、相关性排序
    • 难度:★★★★★

真实面试经验(系统设计轮怎么发生)

  • Google 系统设计面试真实经历 — 完整面经:L5 候选人视角的 Google SD 轮,追问节奏和评分逻辑
  • Senior / Staff 系统设计怎么考 — L5/L6 分级解析:同一道题在 L4/L5/L6 的追问深度差异

数据方向系统设计

Data Engineer / 数据平台岗的系统设计不是 URL shortener,而是实时管道、数据质量、回填、湖仓建模。题型分类和 10 篇深度案例见 Data Engineer 面试题的 DE System Design 题型地图。

提示: 不要试图记住所有题目的答案。掌握核心设计模式和权衡取舍,你就能应对任何题目。

各公司系统设计面试特点

不同公司的系统设计面试侧重点不同。了解这些差异能让你更精准地准备。

Meta(Facebook)

特点:

  • 注重规模估算和trade-offs
  • 喜欢问开放性问题,没有标准答案
  • 强调”为什么”而不是”是什么”

常见题目:

  • 设计 Facebook News Feed
  • 设计 Messenger
  • 设计 Instagram Stories

准备策略:

  • 重点练习容量估算(QPS、存储、带宽)
  • 准备讨论一致性 vs 可用性的 trade-off
  • 关注 Meta 的技术博客(engineering.fb.com)

Google

特点:

  • 注重API 设计和数据模型
  • 喜欢深入细节(如”如果数据库宕机怎么办?”)
  • 强调可扩展性和容错

常见题目:

  • 设计 Google Drive
  • 设计 Google Maps
  • 设计分布式键值存储

准备策略:

  • 练习清晰定义 API 接口
  • 准备讨论分布式一致性协议
  • 阅读 Google 的学术论文(Bigtable、Spanner、MapReduce)

Amazon

特点:

  • 结合Leadership Principles评估
  • 注重客户至上和简约
  • 喜欢问”如果资源有限,你先实现什么?”

常见题目:

  • 设计 Amazon 购物车
  • 设计 AWS S3
  • 设计订单处理系统

准备策略:

  • 用 STAR 方法解释设计决策
  • 强调客户体验和业务价值
  • 准备讨论 MVP(最小可行产品)策略

Netflix

特点:

  • 注重混沌工程和故障注入
  • 喜欢问”如果某个组件失败,系统如何降级?”
  • 强调自动化和弹性

常见题目:

  • 设计视频流媒体服务
  • 设计推荐引擎
  • 设计 Chaos Monkey

准备策略:

  • 重点练习故障场景分析
  • 准备讨论熔断、降级、限流策略
  • 关注 Netflix 技术博客(Netflix Tech Blog)

准备策略

第一阶段:学习基础知识(2-3 周)

必读资源:

  • 《Designing Data-Intensive Applications》(DDIA)— 系统设计圣经
  • 《System Design Interview》by Alex Xu — 面试实战指南
  • Grokking the System Design Interview — 在线课程

学习路径:

  1. 先理解核心概念(数据库、缓存、负载均衡)
  2. 学习经典系统设计模式(CDN、微服务、事件驱动)
  3. 练习 3-5 道经典题目

第二阶段:实战练习(3-4 周)

练习方法:

  1. 纸上画图:不要直接在电脑上写代码,用纸笔画架构图
  2. 计时练习:每道题 45 分钟,模拟考试环境
  3. 录音回放:录下自己的回答,检查是否清晰、有逻辑

练习频率:

  • 每周 2-3 道题目
  • 每道题至少练习 2 遍(第一次学习,第二次模拟面试)

推荐练习题目:

  1. URL 短链服务
  2. Rate Limiter
  3. Twitter 信息流
  4. 聊天系统
  5. 分布式文件系统

第三阶段:模拟面试(2-3 周)

模拟面试平台:

  • interviewing.io — 免费模拟面试
  • Pramp — Peer-to-peer 练习
  • Gainlo — 真实面经和大佬模拟

模拟面试要点:

  • 找有系统设计面试经验的人
  • 模拟真实环境(计时、白板/共享文档)
  • 请求具体反馈(“我哪里讲得不够清晰?“)

第四阶段:查漏补缺(1-2 周)

复习清单:

  • 核心知识点(数据库、缓存、负载均衡、消息队列)
  • 5 步回答框架
  • 容量估算公式
  • 常见 trade-offs
  • 目标公司的面试特点

最后准备:

  • 复习自己做过的题目
  • 准备 2-3 个”杀手级”设计(能深入讨论的细节)
  • 调整心态,系统设计面试是展示你工程思维的

💡 需要面试辅导?

如果你对准备技术面试感到迷茫,或者想要个性化的面试指导和简历优化,欢迎联系 Interview Coach Pro 获取一对一辅导服务。

👉 系统设计 Mock 面试服务 预约针对性系统设计训练,或 联系我们 获取专属面试准备方案

FAQ

系统设计面试最常见的评分标准是什么?

常见评分维度包括需求澄清、API 设计、数据模型、核心组件、扩展性、容错、容量估算、trade-off 和沟通结构。不同公司权重不同,但面试官基本都会看你能不能把设计从模糊题面推进到可落地架构。

System design interview 需要背多少题?

不建议只背题。更有效的是掌握 6-8 类系统:feed、chat、search、storage、rate limiter、recommendation、payment/job scheduler 和 analytics pipeline。每类准备一套高质量答案,再练 follow-up。

L4/L5 和 Senior 系统设计有什么区别?

L4/L5 更看重完整性和基础 trade-off,Senior 更看重边界判断、故障模式、组织复杂度和长期演进。Senior 候选人不能只说“加缓存、加 MQ、分库分表”,还要说明为什么、什么时候不该这样做,以及如何验证系统表现。

System Design 该自学还是上 1对1 mock?

框架和常见系统(feed、chat、search 等 6-8 类)可以先自学搭建;但 follow-up 深挖和表达结构必须靠真人 mock 练。这篇路线对比里按剩余时间和瓶颈给了具体建议,Senior 岗位因为追问更深,真人反馈的性价比最高。

系统设计面试每天需要学多久?

6 周、每天 3-5 小时够用:第 1-2 周打基础(容量估算、负载均衡、缓存、数据库分片),第 3-4 周过 6-8 个核心系统,第 5-6 周限时 mock + follow-up 深挖。关键是每天练习”把设计大声讲出来”,系统设计是口头表达题,不是默写题。

系统设计和分布式系统课程/认证有什么区别?

分布式系统课程偏协议正确性(Raft、2PC、CAP 证明),面试偏工程 trade-off 和沟通结构。面试不需要证明 CAP 定理,但要能清楚说出”这个场景我为什么选 AP 不选 CP,代价是什么,怎么验证”。把课程知识翻译成面试语言是准备的核心动作。

应届生面试需要系统设计吗?

大多数大厂(Google、Meta、Amazon 等)应届生轮次包含系统设计,但深度明显低于社招:重点在需求澄清、基础架构和找出瓶颈,不要求多 region 部署、复杂故障恢复和成本优化。把 6-8 个核心系统的”基础版”讲清楚,再加容量估算,应届生就够用了。

S

关于作者

Sam 是 Interview Coach Pro 的技术面试教练,长期辅导在美国求职的中文候选人准备 SDE、System Design、Behavioral、Data Engineer 和 ML Engineer 面试。

本文基于匿名面试复盘、公开岗位要求和一对一辅导中的高频问题整理,发布前会检查内容结构、术语准确性和可操作性。你也可以查看我们的 辅导团队 和 辅导方法。

相关面试辅导

如果你正在准备类似面试,可以直接从下面的专项辅导开始。

准备好拿下下一次面试了吗?

获取针对你的目标岗位和公司的个性化辅导方案。

联系我们