system-design · git:20260919.2ea5304 · 2026-09-19 · sha256 fbc37c20536c3edf
system-design git:20260919.2ea5304A
Immutable. This exact content never changes and is served at /api/v1/blob/fbc37c20536c3edf.
--- name: system-design description: 系统设计通用方法怎么面:需求澄清与容量估算、存储选型、扩展性与分片、一致性与幂等、容错与降级。二面、架构面以及后端/全栈/基础架构岗位加载。 keywords: [系统设计, 架构设计, 高并发, 容量估算, 分布式, 一致性, 缓存, 消息队列, 限流, 容错, system design, architecture, 后端, 基础架构, 全栈] layer: base --- ## 面试官在意什么 系统设计题在国内一线互联网公司通常出现在二面或三面,形式是给一个业务场景(短链、秒杀、feed、IM、点赞计数、订单超时关闭、分布式 ID),让候选人从零设计并接受连续追问;外企的 system design round 更强调候选人主导流程:澄清需求、估算规模、画出高层设计、深入一两个组件、讨论权衡与失败模式。面试官真正评估的不是画出的架构图有多完整,而是候选人能否把每一个组件的存在理由说清楚,能否在被追问"如果 X 变了"时调整方案而不是崩溃。 校招候选人的系统设计题会明显降低复杂度:问的是"为什么要有缓存、为什么要有队列、怎么保证不超卖"这种单点决策,以及能否用估算把"高并发"变成具体的数字;社招则要求完整的取舍能力:CAP 层面的选择、数据分片键的确定、跨服务一致性的处理、灰度与回滚、成本。 面试官最在意三件事:第一,先问清楚再设计——不问规模、读写比、一致性要求就直接上架构图的候选人几乎必然得低分;第二,数字感——能把"千万用户"翻译成 QPS、存储量、带宽,并据此判断需不需要分片、需不需要缓存;第三,失败模式——每一个组件挂了系统会怎样,数据会不会丢、会不会重、会不会不一致,候选人有没有想过。 怎么问才像这个方向的面试官: - 系统设计题必须从需求澄清开始,候选人不问规模就动手时先不打断,之后用"如果流量是你假设的十分之一/十倍"检验其设计是否过度或不足。 - 每个组件都追问"去掉它会怎样"和"它挂了会怎样",考存在理由与失败模式,不考画图完整度。 - 校招把题目降到单点决策与估算,重点看数字感与因果推理;社招必须涉及跨服务一致性、分片、故障恢复与成本取舍。 - 不考中间件的名词版本与配置项,考选型理由与替代方案;候选人用了不熟悉的中间件时允许其用自己熟悉的替代来讨论。 ## 项目 / 实习怎么深挖 简历上出现下面这类经历时从哪里切、追什么。追到候选人能说出机制、数字的来源与一次真实的故障或取舍才算实;只有框架名与结论、说不出自己那一段的,记为危险信号。通用的追问方法见 project-deep-dive。 - 简历出现"高并发""秒杀""抢购" → 追每一层拦截的流量数字、防超卖手段、幂等设计。 - 简历出现 Redis 缓存 → 追一致性策略的失败窗口、热 key 处理、命中率。 - 简历出现消息队列 → 追投递语义、消费幂等、积压处理与监控。 - 简历出现分库分表 → 追分片键选择依据、跨分片查询方案、扩容迁移步骤。 - 简历出现微服务 → 追服务边界划分依据、跨服务一致性方案、超时与熔断配置。 - 简历出现"高可用""99.9%" → 追单点在哪、主从切换的数据窗口、真实故障经历。 - 简历出现自研中间件或框架 → 追为什么不用现成的、设计的失败模式、被谁用过。 ## 常见失守与危险信号 - 需求澄清与范围界定:不问任何问题直接画图;把所有需求都当成必须满足;说不出功能需求与非功能需求的区别。 - 容量估算:不会把日活转成 QPS;估算完不回到设计决策;数量级错误却没有察觉(比如算出单机需要 10TB 内存仍然不改方案)。 - 存储选型:所有场景都选 MySQL 或都选 MongoDB;说不出访问模式和存储结构的关系;把"NoSQL 快"当理由。 - 缓存策略:只会背"三个雪崩"名词;一致性策略只有"先删缓存再更新数据库"却说不出竞态;对热 key 没有任何思路。 - 数据分片与扩展性:分片键随手选主键 ID;对跨分片查询的回答只有"用 ES";不知道扩容需要迁移数据。 - 一致性与幂等:所有跨服务写都答"用分布式事务框架";幂等只说"加个唯一索引"不考虑乱序;不知道对账。 - 消息队列与异步化:把队列当万能解耦而不谈可靠性;不知道至少一次投递意味着必须幂等;积压只答"加消费者"。 - 限流、降级与容错:只会背限流算法名;不知道超时应该短于调用方超时;降级方案是"返回错误"。 - 高可用与故障处理:高可用只说"部署多台";不知道主从切换会丢数据;把多活当默认选项。 - 分布式 ID 与延迟任务:延迟任务只答"定时扫表"不考虑压力;不知道 Redis 过期事件不可靠;雪花算法说不出时钟回拨。 - 可观测性与上线:监控只有"看日志";说不出 SLO;上线方式是全量直接切。 - 完整场景推演:直接背出一张图但说不清每一层的存在理由;被注入故障后方案推倒重来;不知道自己设计的瓶颈在哪。 ## 常考主题清单 只列名字、阶梯与答实的标志,作"问到哪一层算实"的参考;问哪些、问几道由这份 JD 与这份简历定,不是配额。 ### 需求澄清与范围界定 - 阶梯:让候选人列出该问什么 → 功能需求与非功能需求(延迟、可用性、一致性)的区分 → 哪些需求互相冲突、怎么排优先级 → 面试官故意改一个约束,看方案怎么变 - 答实的标志:先问规模、读写比、延迟与一致性要求;能识别关键约束;主动声明假设并请面试官确认。 ### 容量估算 - 阶梯:日活转换成 QPS 的方法 → 峰值与均值的倍数、存储量的推算 → 用估算结果决定单机能否扛住、需不需要分片 → 估算偏差一个量级时设计是否仍然成立 - 答实的标志:估算过程有假设、有单位换算;能说出峰值倍数的依据;估算结果直接驱动分片、缓存、异步化的决策。 ### 存储选型 - 阶梯:关系型和 NoSQL 的适用场景 → 按访问模式选存储(点查、范围、全文、时序、图) → 一个业务里为什么会同时用多种存储、数据怎么同步 → 选错存储的代价与迁移路径 - 答实的标志:从访问模式和数据模型出发;能说出各存储的写放大、读放大或一致性代价;知道多存储共存时的同步方案。 ### 缓存策略 - 阶梯:为什么要缓存、放哪一层 → 缓存与数据库的一致性策略(cache-aside、write-through、延迟双删) → 穿透、击穿、雪崩各怎么防,热 key 怎么发现与处理 → 缓存命中率多少以下就不值得 - 答实的标志:能说出一致性策略的失败窗口;有本地缓存加多级缓存的热 key 方案;知道缓存监控指标;能评估缓存引入的复杂度。 ### 数据分片与扩展性 - 阶梯:单库单表的上限在哪 → 分片键怎么选、为什么 → 跨分片查询、跨分片事务、热点分片怎么办 → 扩容时数据怎么迁移、一致性哈希与范围分片的取舍 - 答实的标志:分片键从查询模式反推;有异构索引表或冗余写的方案;能说出扩容方案与双写迁移的步骤。 ### 一致性与幂等 - 阶梯:强一致、最终一致分别适用什么场景 → 幂等的实现手段(唯一键、状态机、去重表、token) → 跨服务写操作的一致性方案(本地消息表、事务消息、Saga、TCC)与各自失败点 → 什么时候该放弃分布式事务用对账兜底 - 答实的标志:能区分一致性等级并对应业务;幂等设计考虑并发与乱序;知道最终一致的补偿与人工介入路径。 ### 消息队列与异步化 - 阶梯:为什么要引入队列、削峰和解耦分别指什么 → 消息丢失、重复、乱序的成因与对策 → 消费积压怎么发现与处理、死信怎么办 → 同步改异步后用户体验与可观测性的代价 - 答实的标志:能说出投递语义与业务匹配;有积压监控与限流、扩容、丢弃策略;考虑了异步后的状态查询。 ### 限流、降级与容错 - 阶梯:限流算法(固定窗口、滑动窗口、令牌桶、漏桶)的差异 → 限流放在网关还是服务、按什么维度 → 依赖服务超时或宕机时的熔断、降级、兜底数据 → 降级开关谁来拨、怎么防误伤核心链路 - 答实的标志:超时、重试、熔断、隔离(线程池或信号量)成体系;有兜底数据方案;知道重试风暴与退避。 ### 高可用与故障处理 - 阶梯:单点在哪、怎么消除 → 主从切换的数据丢失窗口与脑裂 → 一次机房故障时哪些功能可用、哪些不可用 → 多活的成本与一致性代价,什么业务值得做 - 答实的标志:能说出每个组件的故障模式和恢复时间;有数据丢失的业务补偿方案;对多活有成本认知。 ### 分布式 ID 与延迟任务 - 阶梯:为什么不能用自增主键 → 雪花算法的位分配与时钟回拨、号段模式的双 buffer → 发号服务本身挂了怎么办 → 延迟任务(订单超时)用轮询、Redis ZSet、MQ 延迟消息的取舍 - 答实的标志:方案按量级与可靠性要求选择;考虑了任务丢失与重复执行;发号有降级路径。 ### 可观测性与上线 - 阶梯:新系统上线前要有什么监控 → 指标、日志、链路追踪各解决什么问题 → 一次"接口偶发超时"从哪些指标开始查 → 灰度发布怎么切流量、怎么定回滚标准 - 答实的标志:有 RED 或 USE 类指标体系;有告警阈值与 SLO;灰度有量化的推进与回滚标准。 ### 完整场景推演 - 阶梯:给一个常见系统(短链、点赞、IM、秒杀、feed)要求完整设计 → 深入其中一个组件的读写路径 → 面试官注入一个故障或十倍流量看方案调整 → 讨论这个设计最先需要重构的地方 - 答实的标志:分层漏斗有数字;每个组件有失败模式说明;能指出自己设计的下一个瓶颈与演进方向。