第 38 章 通用系统设计题库
本章按通用能力组织题卡。每张题卡都要求从业务目标、规模、主路径、权威状态、失败处理和演进取舍展开,不把组件名称当作答案。
需求澄清与范围控制
Q-GEN-SCOPE-01:系统设计面试与算法面试的区别是什么?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-SCOPE-01 |
| 来源 | 01-system-design-interview-overview.md,本章面试题与追问第 1 题 |
| 时长 | 10 分钟 |
| 难度 | 基础 |
| 场景 | 通用面试 |
| 题型 | 短追问 |
| 能力标签 | 问题定义、结构化表达 |
题干与约束
说明系统设计面试与算法面试考察的差异,以及为什么系统设计题应先澄清问题。
候选人作答任务
用一段完整回答说明考察目标,并给出首轮澄清问题。
推荐作答顺序
先区分确定输入下的求解与不完整约束下的设计,再说明目标、规模、状态和风险如何影响方案。
答案骨架
算法题更强调在确定条件下构造正确、高效的求解;系统设计题要求在信息不完整时定义问题、选取边界并解释取舍。先澄清可避免为错误目标堆组件,随后才能讨论容量、数据与可靠性。
评分锚点
基础回答能说出先澄清。较好回答能指出约束改变架构。优秀回答能主动给出非目标和验证指标。
递进追问
业务方只说“用户很多且必须稳定”时,下一句如何追问?
常见失分点
把系统设计说成算法题的放大版;直接罗列中间件;遗漏非目标。
关联正文
复盘清单
- 我是否先说明了目标、约束和非目标?
- 我是否把澄清结果连到后续决策?
Q-GEN-SCOPE-02:设计秒杀系统前需要澄清什么?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-SCOPE-02 |
| 来源 | 01-system-design-interview-overview.md,本章面试题与追问第 2 题 |
| 时长 | 10 分钟 |
| 难度 | 基础 |
| 场景 | 秒杀 |
| 题型 | 专题设计 |
| 能力标签 | 需求澄清、热点识别 |
题干与约束
设计一个秒杀系统,但尚未给出商品规模、库存、用户资格和支付规则。
候选人作答任务
列出会改变库存、限流和异步方案的关键问题,并说明原因。
推荐作答顺序
确认活动峰值和商品热点,再确认库存事实、资格规则、下单与支付时限,最后确认可接受的排队、失败和降级体验。
答案骨架
需要确认瞬时请求量、商品库存和每人限购、是否预热、库存以何处为准、订单是否必须同步创建、未支付释放规则、风控和地域限制。极端热点决定入口限流与排队;正确性要求决定预扣、条件更新和对账方案。
评分锚点
基础回答问流量和库存。较好回答补充资格、支付超时和风控。优秀回答能把每项约束映射到对应机制。
递进追问
十万人同时抢一万件商品,和一小时内均匀产生十万订单,设计有什么不同?
常见失分点
把平均流量当峰值;只谈 Redis;没有问库存释放和重复提交。
关联正文
第 7 章 高准确性与强一致性、第 9 章 高并发写与热点、第 27 章 库存系统
复盘清单
- 我是否区分了活动瞬时峰值与平均流量?
- 我是否说明了库存和订单的权威状态?
容量估算与性能设计
Q-GEN-CAP-01:如何把容量估算转化为设计依据?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-CAP-01 |
| 来源 | 01-system-design-interview-overview.md,本章面试题与追问第 3 题;06-whiteboard-capacity-estimation.md,容量估算口径 |
| 时长 | 20 分钟 |
| 难度 | 进阶 |
| 场景 | 通用白板 |
| 题型 | 专题设计 |
| 能力标签 | 容量估算、性能设计 |
题干与约束
说明如何估算峰值 QPS、并发、数据量、带宽和存储增长,并把结果用于设计。
候选人作答任务
选择一个下单或内容读取场景,给出口径、数量级和至少三项设计影响。
推荐作答顺序
从用户行为推导请求量,再用峰值放大和读写比例拆链路,随后估算数据、带宽、热点和异步流量。
答案骨架
先声明活跃用户、每人操作次数和峰值集中度;再计算核心读写 QPS,并加上重试、回调和异步消费。读高时设计缓存与读模型,写高时设计削峰和分片,热点集中时预热、隔离和限流,数据增长影响索引、归档与容量余量。
评分锚点
基础回答有数量级。较好回答区分读写与峰值。优秀回答能说明估算误差、外部依赖和演进阈值。
递进追问
若用户流量不变但活动压缩到一分钟,哪些估算必须重做?
常见失分点
只报一个 QPS;忽略重试和回调;估算后没有落到架构选择。
关联正文
第 1 章 系统设计方法论、第 8 章 低延迟复杂读、第 9 章 高并发写与热点
复盘清单
- 我是否明确了峰值和容量余量的口径?
- 我是否把每个数量级结论转化为设计选择?
数据建模、一致性与事务
Q-GEN-DATA-01:为什么核心交易状态要有权威来源?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-DATA-01 |
| 来源 | 01-system-design-interview-overview.md,本章面试题与追问第 4 题 |
| 时长 | 15 分钟 |
| 难度 | 进阶 |
| 场景 | 订单、支付、库存 |
| 题型 | 短追问 |
| 能力标签 | 数据建模、一致性 |
题干与约束
订单、支付、库存热路径使用缓存时,如何解释权威状态与修复策略?
候选人作答任务
说明权威来源、缓存职责,以及不一致后的恢复流程。
推荐作答顺序
先定义不可丢失的业务事实,再划分热路径与权威路径,最后说明对账、补偿和人工处理。
答案骨架
交易状态必须有可审计、可约束、可恢复的权威来源;缓存承担低延迟、热点拦截或短期预扣,不能替代账本与状态机。发生偏差时以权威记录为准,通过事件重放、对账任务、补偿和告警追平。
评分锚点
基础回答区分缓存和数据库。较好回答说明状态机和幂等。优秀回答明确责任方、修复入口和审计证据。
递进追问
缓存预扣成功、权威写入失败时,用户和库存分别如何处理?
常见失分点
宣称缓存天然强一致;没有对账;把最终一致当作不处理失败。
关联正文
第 4 章 大事务处理、第 7 章 高准确性与强一致性、第 32 章 订单系统
复盘清单
- 我是否明确了每类状态的权威来源?
- 我是否说明了发现和修复偏差的闭环?
Q-GEN-DATA-02:系统设计题中如何回答一致性问题?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-DATA-02 |
| 来源 | 01-system-design-interview-overview.md,本章面试题与追问第 8 题 |
| 时长 | 15 分钟 |
| 难度 | 进阶 |
| 场景 | 跨系统协作 |
| 题型 | 短追问 |
| 能力标签 | 一致性、取舍表达 |
题干与约束
如何避免把强一致和最终一致说成空泛口号?
候选人作答任务
以交易主链路和搜索投影为例,说明对象、强度、时限、失败处理和代价。
推荐作答顺序
先界定对象与错误后果,再确定同步边界和允许延迟,随后说明幂等、补偿、对账和监控。
答案骨架
订单提交、支付状态和库存确认等资损敏感事实需要强约束或同步确认;搜索、推荐、报表等派生读模型通常允许最终一致。最终一致必须说明延迟目标、可靠投递、重放幂等、对账和人工修复,而不是只说异步。
评分锚点
基础回答能分类。较好回答说出延迟和补偿。优秀回答能量化错误后果并解释性能代价。
递进追问
支付已成功但订单状态尚未更新时,什么数据对用户可见,谁负责补偿?
常见失分点
所有链路都强一致;所有异步都最终一致;没有时间边界和修复责任。
关联正文
第 4 章 大事务处理、第 7 章 高准确性与强一致性、第 33 章 支付系统
复盘清单
- 我是否说明了一致性的对象和可接受时限?
- 我是否给出了失败后的补偿和对账路径?
Q-GEN-DATA-03:为什么核心交易状态通常放在 MySQL?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-DATA-03 |
| 来源 | 02-middleware-reliability-interview.md,MySQL 高频追问:为什么核心交易状态通常放在 MySQL? |
| 时长 | 10 分钟 |
| 难度 | 基础 |
| 场景 | 交易存储 |
| 题型 | 中间件追问 |
| 能力标签 | 权威存储、事务 |
题干与约束
解释为什么订单、支付和库存流水通常以 MySQL 承载权威状态。
候选人作答任务
说明 MySQL 的职责、缓存和消息的职责,以及边界。
推荐作答顺序
先讲事务、约束、审计和恢复,再说明读扩展与异步传播。
答案骨架
核心交易需要原子更新、唯一约束、状态机校验、审计和恢复能力,因此以关系型事务存储承载权威事实。缓存用于加速与削峰,消息用于传播副作用;它们都不能替代最终状态的可验证来源。
评分锚点
基础回答提到事务。较好回答提到约束和账本。优秀回答能说明热点下的缓存预扣与数据库兜底。
递进追问
数据库成为瓶颈后,怎样扩展而不把权威状态交给缓存?
常见失分点
把 MySQL 说成所有数据的唯一选择;忽略读写分离、分片和归档;把消息当存储替代品。
关联正文
第 7 章 高准确性与强一致性、第 27 章 库存系统、第 32 章 订单系统
复盘清单
- 我是否说清了权威状态需要的能力?
- 我是否说明了缓存和消息不承担什么职责?
Q-GEN-DATA-04:库存扣减如何防止超卖?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-DATA-04 |
| 来源 | 02-middleware-reliability-interview.md,MySQL 高频追问:库存扣减如何防止超卖? |
| 时长 | 20 分钟 |
| 难度 | 进阶 |
| 场景 | 库存扣减 |
| 题型 | 专题设计 |
| 能力标签 | 并发控制、库存一致性 |
题干与约束
高并发下单时既要防超卖,也要处理取消、支付失败和重复请求。
候选人作答任务
设计库存检查、预占、确认、释放和对账链路。
推荐作答顺序
先确定库存事实和售卖规则,再讲原子扣减或条件更新,随后补充预占生命周期、幂等和恢复。
答案骨架
数据库使用条件更新、乐观锁或库存账本保护最终正确性;热点可先在缓存中原子预扣和限流。订单创建、支付成功、超时取消都通过唯一业务键和状态机推进预占、确认或释放;定期对账修复缓存与权威库存偏差。
评分锚点
基础回答有条件更新。较好回答有预占释放。优秀回答覆盖重复、乱序、对账和资损告警。
递进追问
支付回调重复且取消任务晚到时,如何避免已售库存被释放?
常见失分点
只用分布式锁;没有库存流水;支付失败后不释放;没有幂等键。
关联正文
第 7 章 高准确性与强一致性、第 9 章 高并发写与热点、第 27 章 库存系统
复盘清单
- 我是否覆盖了预占、确认、释放和对账?
- 我是否说明了并发与重复下的状态机约束?
Q-GEN-DATA-05:缓存和数据库不一致怎么办?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-DATA-05 |
| 来源 | 02-middleware-reliability-interview.md,Redis 高频追问:缓存和数据库不一致怎么办? |
| 时长 | 15 分钟 |
| 难度 | 进阶 |
| 场景 | 缓存 |
| 题型 | 中间件追问 |
| 能力标签 | 缓存一致性、故障恢复 |
题干与约束
核心数据更新后,缓存删除或刷新可能失败,业务允许的不一致窗口有限。
候选人作答任务
选择一致性策略,说明失败恢复和适用边界。
推荐作答顺序
先确认数据是否可容忍短暂陈旧,再确定权威读写路径,最后设计失效、重试、补偿和监控。
答案骨架
通常采用缓存旁路:写入权威存储成功后删除缓存,读取未命中时回源重建,并设置合理过期。对更敏感的数据可使用消息驱动刷新、延迟删除、版本号或直接读权威存储;删除失败必须重试、告警和补偿,不能承诺绝对一致。
评分锚点
基础回答会删除缓存。较好回答说明并发窗口。优秀回答能按业务风险选择策略并提供可观测性。
递进追问
更新成功但删除缓存失败,怎样避免陈旧数据长期存在?
常见失分点
先删缓存再写库且不处理失败;读写都强制同步更新缓存;没有过期和补偿。
关联正文
第 3 章 生产系统治理、第 8 章 低延迟复杂读、第 30 章 搜索与导购
复盘清单
- 我是否先判断陈旧数据的业务后果?
- 我是否说明了缓存刷新失败后的恢复闭环?
Q-GEN-DATA-06:分布式锁能解决所有并发问题吗?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-DATA-06 |
| 来源 | 02-middleware-reliability-interview.md,Redis 高频追问:分布式锁能解决所有并发问题吗? |
| 时长 | 10 分钟 |
| 难度 | 进阶 |
| 场景 | 并发控制 |
| 题型 | 中间件追问 |
| 能力标签 | 锁、幂等、状态机 |
题干与约束
多个节点并发修改库存或订单状态,团队希望统一使用分布式锁。
候选人作答任务
说明锁能解决什么、不能解决什么,以及核心状态的更可靠保护方式。
推荐作答顺序
先界定临界区和锁的失效条件,再说明数据库约束、条件更新和业务幂等。
答案骨架
分布式锁只能降低特定临界区的并发冲突,还会面对超时、续租、误释放、主从切换和网络分区。资金、库存和状态流转应以唯一约束、条件更新、版本号和状态机为最终保护;锁可作为优化,业务操作仍必须幂等。
评分锚点
基础回答能指出锁超时。较好回答有条件更新。优秀回答说明围栏令牌或失锁后的停止写入。
递进追问
持锁节点长时间停顿后恢复,如何防止它覆盖新持锁者的结果?
常见失分点
把锁当事务;不设置业务幂等;只讨论获取锁,不讨论失锁和释放。
关联正文
第 5 章 长生命周期业务流程、第 7 章 高准确性与强一致性、第 27 章 库存系统
复盘清单
- 我是否区分了并发优化和最终正确性保护?
- 我是否覆盖了锁失效后的业务行为?
高可用、故障恢复与可观测性
Q-GEN-REL-01:如何解释高可用?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-REL-01 |
| 来源 | 01-system-design-interview-overview.md,本章面试题与追问第 7 题 |
| 时长 | 15 分钟 |
| 难度 | 进阶 |
| 场景 | 生产治理 |
| 题型 | 短追问 |
| 能力标签 | 高可用、可观测性 |
题干与约束
解释限流、熔断、降级、隔离、数据保护和演练如何组成可用性设计。
候选人作答任务
按流量、依赖、数据和运维四层给出具体措施。
推荐作答顺序
先说明要保护的核心路径和可用性目标,再分别覆盖流量、依赖、数据和运营恢复。
答案骨架
高可用不是增加实例数,而是让故障被限制、被发现、被恢复。流量层限流和隔离,依赖层超时、重试、熔断和快速失败,数据层复制、对账和补偿,运维层监控、告警、压测、演练和扩容预案;非核心能力在故障时让路给主交易。
评分锚点
基础回答会列举保护手段。较好回答能关联到链路。优秀回答能定义降级优先级和恢复指标。
递进追问
推荐服务异常时,商品详情和下单链路分别应该如何表现?
常见失分点
只说多机房;所有功能同等保护;没有监控和演练。
关联正文
第 3 章 生产系统治理、第 9 章 高并发写与热点、第 36 章 电商用户全生命周期
复盘清单
- 我是否先定义了必须保护的核心业务?
- 我是否覆盖了预防、发现、恢复三个阶段?
Q-GEN-REL-02:超时、重试与幂等如何协作?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-REL-02 |
| 来源 | 02-middleware-reliability-interview.md,可靠性高频追问:超时、重试和幂等是什么关系? |
| 时长 | 15 分钟 |
| 难度 | 进阶 |
| 场景 | 同步与异步调用 |
| 题型 | 中间件追问 |
| 能力标签 | 超时、重试、幂等 |
题干与约束
下游偶发超时,调用方需要提高成功率但不能重复创建订单、扣库存或支付。
候选人作答任务
说明三者的职责、重试条件和幂等落点。
推荐作答顺序
先设定超时边界,再区分可重试与不可重试错误,最后定义业务唯一键和结果查询方式。
答案骨架
超时防止资源无限等待,重试处理可恢复的瞬时失败,幂等确保重复请求产生相同业务结果。调用方使用有限次数、退避和抖动;服务端用请求键、唯一约束、状态机或去重记录收敛副作用,并在未知结果时查询最终状态而非盲目重试。
评分锚点
基础回答能定义三者。较好回答有退避和错误分类。优秀回答能处理超时后结果未知与跨服务幂等。
递进追问
支付请求超时但渠道可能已扣款,客户端能否重试?服务端应返回什么?
常见失分点
所有异常都重试;只在客户端做幂等;没有重试上限和观测。
关联正文
第 3 章 生产系统治理、第 4 章 大事务处理、第 33 章 支付系统
复盘清单
- 我是否区分了失败、超时和结果未知?
- 我是否说明了幂等键与最终状态查询?
Q-GEN-REL-03:什么时候用熔断,什么时候用降级?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-REL-03 |
| 来源 | 02-middleware-reliability-interview.md,可靠性高频追问:什么时候用熔断,什么时候用降级? |
| 时长 | 10 分钟 |
| 难度 | 基础 |
| 场景 | 依赖故障 |
| 题型 | 中间件追问 |
| 能力标签 | 熔断、降级、业务优先级 |
题干与约束
推荐、通知和支付渠道等依赖发生持续失败,主业务需要保持可用。
候选人作答任务
区分两种机制的目标,并给出具体业务动作。
推荐作答顺序
先确定下游故障是否拖垮调用方,再判断当前功能是否可被替代或延后。
答案骨架
熔断在错误率或延迟异常时快速拒绝调用,保护调用方资源并等待探测恢复;降级是在非核心能力不可用时提供简化结果或关闭功能,保护核心业务。例如详情页可移除推荐模块,支付渠道异常应切换渠道、保留处理中状态或转人工,不能伪造成功。
评分锚点
基础回答能区分定义。较好回答能给出恢复条件。优秀回答能按业务风险设计不同降级结果。
递进追问
通知服务熔断后,怎样保证交易状态仍可被用户查询和后续补发?
常见失分点
把熔断等同于服务下线;对支付直接返回成功;没有恢复和补偿策略。
关联正文
第 3 章 生产系统治理、第 33 章 支付系统、第 36 章 电商用户全生命周期
复盘清单
- 我是否按核心程度定义降级结果?
- 我是否说明熔断后的恢复探测和补偿?
中间件与基础设施
Q-GEN-MW-01:什么场景应该引入消息队列?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-MW-01 |
| 来源 | 01-system-design-interview-overview.md,本章面试题与追问第 5 题 |
| 时长 | 15 分钟 |
| 难度 | 进阶 |
| 场景 | 异步协作 |
| 题型 | 中间件追问 |
| 能力标签 | 消息队列、异步设计 |
题干与约束
订单成功后需要通知、积分和索引更新,但主链路不能被非核心下游拖慢。
候选人作答任务
说明何时引入消息队列,以及顺序、重复、积压和失败如何处理。
推荐作答顺序
先定义必须同步确认的事实,再识别可异步的副作用,最后设计可靠投递和消费治理。
答案骨架
消息队列适合削峰、异步解耦、事件传播和失败重试,不是“解耦”万能答案。核心状态先在本地事务内落稳,通过本地消息表或可靠事件发布异步驱动下游;按业务键设计分区顺序,消费者幂等,积压时限流、扩容、回压或降级。
评分锚点
基础回答能说出异步化。较好回答覆盖幂等和积压。优秀回答能区分业务顺序、投递保证和补偿边界。
递进追问
订单创建成功但事件未发出,怎样避免下游长期遗漏?
常见失分点
事务内同步发送消息且无补偿;以为消息顺序等于业务正确;忽略积压和死信。
关联正文
第 4 章 大事务处理、第 6 章 任务处理、第 32 章 订单系统
复盘清单
- 我是否说明了消息队列不承担的职责?
- 我是否覆盖投递、消费、积压和补偿?
Q-GEN-MW-02:检索场景为什么不总是使用 Elasticsearch?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-MW-02 |
| 来源 | 01-system-design-interview-overview.md,本章面试题与追问第 6 题 |
| 时长 | 10 分钟 |
| 难度 | 基础 |
| 场景 | 查询选型 |
| 题型 | 中间件追问 |
| 能力标签 | 搜索、存储选型 |
题干与约束
需要解释复杂搜索与按主键、简单条件查询的不同技术选择。
候选人作答任务
说明 Elasticsearch 的能力边界和引入后的代价。
推荐作答顺序
先识别查询模式,再比较事务存储和搜索读模型,最后说明索引同步与降级。
答案骨架
主键和有限条件查询通常由事务存储和索引满足;全文检索、多字段筛选、相关性排序、聚合和复杂分页更适合作为独立搜索读模型。引入 Elasticsearch 后要接受索引延迟,设计重建、异步同步、版本控制和回退查询。
评分锚点
基础回答区分查询能力。较好回答提到索引延迟。优秀回答能说明何时不引入搜索系统。
递进追问
搜索索引落后于商品主数据时,详情页和交易创建分别以什么数据为准?
常见失分点
把 Elasticsearch 当权威事务库;只谈性能;忽略运维和索引重建成本。
关联正文
第 8 章 低延迟复杂读、第 25 章 商品中心、第 30 章 搜索与导购
复盘清单
- 我是否先按查询模式判断?
- 我是否说明了搜索索引不是权威数据?
Q-GEN-MW-03:如何降低 Kafka 消息丢失风险?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-MW-03 |
| 来源 | 02-middleware-reliability-interview.md,Kafka 高频追问:Kafka 如何保证消息不丢? |
| 时长 | 15 分钟 |
| 难度 | 进阶 |
| 场景 | 消息可靠性 |
| 题型 | 中间件追问 |
| 能力标签 | 可靠投递、消息恢复 |
题干与约束
关键事件需从生产端到消费端降低丢失风险,并能被业务恢复。
候选人作答任务
分段说明生产、存储、消费和业务端的保护措施。
推荐作答顺序
先确认业务事件是否已可靠地产生,再分别说明生产确认、副本存储、消费提交和补偿。
答案骨架
生产端使用确认、重试和幂等生产者;集群端使用副本和同步副本集合;消费者在业务处理成功后再提交位点。端到端仍需要本地消息表或可重放事件、幂等消费、监控积压和补偿,因为消息系统配置不能证明业务副作用已经完成。
评分锚点
基础回答知道确认和副本。较好回答知道成功后提交位点。优秀回答能覆盖业务事件生成与补偿。
递进追问
数据库事务已提交但生产者宕机,怎样确保事件最终发出?
常见失分点
只配置确认;先提交位点;把生产者幂等误当业务幂等。
关联正文
第 4 章 大事务处理、第 6 章 任务处理、第 3 章 生产系统治理
复盘清单
- 我是否按生产、存储、消费和业务四段回答?
- 我是否说明了可靠事件与业务恢复?
Q-GEN-MW-04:消息重复时如何保证结果正确?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-MW-04 |
| 来源 | 02-middleware-reliability-interview.md,Kafka 高频追问:消息重复怎么办? |
| 时长 | 15 分钟 |
| 难度 | 进阶 |
| 场景 | 消息消费 |
| 题型 | 中间件追问 |
| 能力标签 | 幂等、状态机 |
题干与约束
消费者按至少一次投递接收事件,重复消费不能造成重复扣款、积分或状态回退。
候选人作答任务
给出幂等键、状态约束和失败重试的设计。
推荐作答顺序
先定义业务唯一事件,再选择去重记录、唯一约束或条件更新,最后处理并发消费和重放。
答案骨架
默认假设消息会重复。消费者以业务唯一键或事件标识建立去重记录,结合数据库唯一约束、状态机条件更新或幂等写入,使重复执行得到相同结果。处理与标记完成要可恢复,失败可安全重试;生产者幂等只减少投递重复,不能替代业务幂等。
评分锚点
基础回答能说去重。较好回答有唯一约束和状态机。优秀回答能处理并发重复与补偿重放。
递进追问
消费者已产生外部副作用但进程在标记完成前崩溃,如何恢复?
常见失分点
仅依赖消息 ID 的内存去重;没有持久化约束;混淆投递幂等和业务幂等。
关联正文
第 4 章 大事务处理、第 5 章 长生命周期业务流程、第 32 章 订单系统
复盘清单
- 我是否明确了幂等键对应的业务语义?
- 我是否说明了重复与崩溃后的恢复?
Q-GEN-MW-05:何时选择 Elasticsearch 而不是 MySQL?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-MW-05 |
| 来源 | 02-middleware-reliability-interview.md,Elasticsearch 高频追问:为什么搜索不用 MySQL 直接查? |
| 时长 | 10 分钟 |
| 难度 | 基础 |
| 场景 | 搜索系统 |
| 题型 | 中间件追问 |
| 能力标签 | 搜索架构、读模型 |
题干与约束
商品需要关键词搜索、筛选、排序和聚合,同时交易系统不能依赖搜索索引正确性。
候选人作答任务
说明选择 Elasticsearch 的门槛、同步方案和交易边界。
推荐作答顺序
先界定搜索体验需求,再说明索引作为派生读模型,最后说明同步失败与重建。
答案骨架
当业务需要全文检索、多维筛选、相关性排序、聚合或深分页治理时选择 Elasticsearch;简单查询继续使用 MySQL。主数据变更通过异步事件更新索引,索引按版本幂等,支持全量重建和补偿;交易创建始终以权威商品、库存和价格校验为准。
评分锚点
基础回答有功能边界。较好回答有异步同步。优秀回答有索引重建、回退和交易隔离。
递进追问
索引更新延迟时,搜索结果中的过期商品怎样处理?
常见失分点
所有查询上搜索系统;同步写主库和索引;让订单直接信任索引字段。
关联正文
第 8 章 低延迟复杂读、第 25 章 商品中心、第 30 章 搜索与导购
复盘清单
- 我是否说明了选择搜索系统的具体门槛?
- 我是否保留了交易对权威状态的校验?
架构演进、成本与技术取舍
Q-GEN-EVO-01:高频系统设计题的底层共性是什么?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-EVO-01 |
| 来源 | 01-system-design-interview-overview.md,本章面试题与追问第 9 题 |
| 时长 | 15 分钟 |
| 难度 | 进阶 |
| 场景 | 综合归纳 |
| 题型 | 短追问 |
| 能力标签 | 模式识别、架构演进 |
题干与约束
秒杀、库存、支付、短链接和 Feed 流题面不同,如何归纳可迁移的设计模式?
候选人作答任务
总结三类以上核心矛盾,并说明各自的通用处理手段。
推荐作答顺序
先按热点写入、权威状态、读放大和跨系统副作用分类,再给出对应设计模式。
答案骨架
高频题通常归结为:热点与吞吐,使用削峰、排队、预热和隔离;业务事实正确性,使用权威状态、条件更新、状态机和对账;跨系统副作用,使用可靠事件、幂等、补偿与观测;复杂读,使用读模型、缓存和可接受的最终一致。题面变化时先识别主矛盾,再选择模式。
评分锚点
基础回答能归类。较好回答能联系具体题目。优秀回答能说明模式失效边界和演进条件。
递进追问
若只能优先解决一个问题,如何从资损、用户体验和系统吞吐中排序?
常见失分点
只按组件分类;把所有题归为缓存或消息队列;没有权威状态和失败恢复。
关联正文
第 1 章 系统设计方法论、第 4 章 大事务处理、第 9 章 高并发写与热点
复盘清单
- 我是否先识别题目的主矛盾?
- 我是否能为每种模式说明边界和失败处理?
Q-GEN-EVO-02:系统设计面试后如何复盘并改进?
元信息
| 项目 | 内容 |
|---|---|
| 题目编号 | Q-GEN-EVO-02 |
| 来源 | 01-system-design-interview-overview.md,本章面试题与追问第 10 题;06-whiteboard-capacity-estimation.md,收尾方式 |
| 时长 | 10 分钟 |
| 难度 | 基础 |
| 场景 | 面试复盘 |
| 题型 | 方法题 |
| 能力标签 | 复盘、表达改进 |
题干与约束
一次面试后发现自己“懂很多但讲不清”,如何建立下一轮训练计划?
候选人作答任务
给出结构、内容和表达三层复盘方法,并转化为可执行练习。
推荐作答顺序
先回放回答顺序,再核对缺失的状态与失败处理,最后把问题写成下一次的限时动作。
答案骨架
结构层检查是否先讲目标、规模、主链路、状态、失败和演进;内容层检查结论是否有依据、是否遗漏权威状态与补偿;表达层检查是否先报框架、是否术语堆叠。每个失分点转成可验证动作,下一轮在改变约束后重答并比较改进。
评分锚点
基础回答会复盘。较好回答能分层。优秀回答能设置可观察的训练目标并根据追问调整。
递进追问
如果每次都遗漏异常处理,下一次白板上应加入什么固定检查点?
常见失分点
只看答案对错;只背更多题;没有记录假设和被追问的边界。
关联正文
复盘清单
- 我是否能列出本次最影响结果的三项遗漏?
- 我是否把每项遗漏转化为下一次可验证动作?
通用答题速查
以下内容用于补足题卡中的选型表达,不替代题卡的完整作答。
缓存策略
| 策略 | 适用场景 | 主要代价 |
|---|---|---|
| 缓存旁路 | 通用读多写少 | 需要处理失效窗口和回源 |
| 读穿透 | 读密集 | 实现与排障边界更复杂 |
| 写穿透 | 对读一致性要求较高 | 写延迟与吞吐受影响 |
| 异步回写 | 写密集 | 需面对数据丢失和恢复风险 |
分布式事务
| 方案 | 适用判断 | 主要代价 |
|---|---|---|
| 两阶段提交 | 必须同步收敛且参与方可控 | 可用性与性能成本高 |
| TCC | 资源可预留、可确认和可取消 | 业务实现复杂 |
| Saga | 长流程可补偿 | 需接受中间状态和补偿设计 |
| 本地消息表 | 多数异步副作用 | 需要消费者幂等和对账 |
限流算法
| 算法 | 适用判断 | 注意点 |
|---|---|---|
| 计数器 | 简单固定窗口限制 | 边界突刺明显 |
| 滑动窗口 | 需要更平滑的统计 | 成本更高 |
| 令牌桶 | 允许有限突发 | 需设置补充速率和容量 |
| 漏桶 | 需要平滑输出 | 可能增加排队延迟 |
分库分表
分片键应服务于主要查询和写入均衡,常见选择包括用户标识、订单标识与时间。先确认跨分片查询、扩容、归档和全局唯一标识的成本;规模未到阈值前可保持单库,同时预留分片键和归档策略。