大厂系统设计面试通关指南:从秒杀系统到消息队列8道真题详解

系统设计作者: 美历团队

汇总8道大厂系统设计高频真题,包括秒杀系统、短链服务、消息队列、朋友圈、搜索引擎、推荐系统、限流器、分布式缓存,每题含需求分析、架构设计、核心组件、扩展方案

大厂系统设计面试通关指南:从秒杀系统到消息队列8道真题详解

背景介绍

我是2024年春招开始集中准备系统设计面试的,之前在一家中型互联网公司做了3年后端开发,平时也做过一些高并发场景,但从来没有系统地梳理过系统设计的答题框架。说实话,第一次被问到"设计一个秒杀系统"的时候,我脑子一片空白,说了半天也没说到点子上。后来我花了两个月时间,把市面上能找到的系统设计题全部过了一遍,总结了8道最高频的题目,每道题都按照需求分析→架构设计→核心组件→扩展方案四步来拆解。这篇文章就是我的完整整理,希望对你有帮助。

面试流程复盘

我先后面了字节、阿里、美团、快手四家大厂的系统设计面,总体感受是:面试官不会要求你设计一个完美的系统,而是看你分析问题的思路处理trade-off的能力。最典型的流程是这样的:

第一步:需求澄清(5分钟)——面试官抛出题目后,千万别直接开讲,一定要先问清楚:用户量级多少?QPS多少?一致性要求是什么?可用性要求是什么?我第一次面试就是没问清楚,直接按照百万QPS去设计,结果面试官说"我们的场景是万级QPS",瞬间显得过度设计了。

第二步:高层设计(10分钟)——画出核心架构图,说明主要模块和数据流向。这里建议用客户端→网关→服务层→存储层的四层模型来组织,基本能覆盖大部分场景。

第三步:深入设计(20分钟)——面试官会挑一两个点深入追问,比如"库存怎么保证不超卖?""缓存和数据库一致性怎么做?"这时候要能讲清楚具体的实现方案。

第四步:扩展讨论(5分钟)——系统规模扩大10倍怎么办?有哪些单点故障?怎么做容灾?这部分答得好能加分很多。

真题一:设计秒杀系统

需求分析:秒杀系统的核心挑战是瞬时高并发,典型场景是10万人抢100件商品。关键指标:QPS可达10万+,库存绝对不能超卖,用户体验上不能出现大面积超时。

架构设计:整体采用前端限流→CDN→网关→秒杀服务→库存服务→订单服务的链路。核心思路是层层过滤,把大部分请求挡在上游,真正到达库存服务的请求只占极小比例。

核心组件:

1. Redis预减库存:秒杀开始前把库存加载到Redis,请求先在Redis中扣减,成功后再异步创建订单。Lua脚本保证原子性。

2. 消息队列削峰:扣减成功后发送MQ消息,订单服务异步消费创建订单,避免数据库直接扛峰值。

3. 前端限流:按钮置灰+验证码+随机丢弃,把QPS降到原来的1/10。

扩展方案:多机房部署时,可以用分布式Redis集群分片存储库存,每片负责一部分商品。同时引入本地缓存做二级判断,减少Redis访问压力。

真题二:设计短链服务

需求分析:将长URL转换为短URL,核心要求:短码尽量短、跳转速度快、不能重复。假设日活1亿,每秒生成1000个短链。

架构设计:写入链路:长URL→哈希/发号器→短码→存储映射。 读取链路:短码→查询存储→302重定向。

核心组件:

1. 发号器:相比MD5哈希,我更推荐用自增ID+Base62编码的方式,短码可控且不重复。分布式场景用Snowflake或Redis INCR。

2. 缓存层:热点短链用Redis缓存,命中率可达95%以上,读性能从10ms降到1ms。

3. 布隆过滤器:写入前先用布隆过滤器判断短码是否已存在,避免重复生成。

扩展方案:全球部署时,可以用GeoDNS将用户路由到最近的数据中心,各数据中心通过异步复制同步短链映射。

真题三:设计消息队列

需求分析:消息队列的核心功能:生产者发消息、消费者收消息、消息不丢不重。关键指标:吞吐量、延迟、消息可靠性。

架构设计:核心模型是Topic→Partition→Consumer Group。消息写入Partition时顺序追加,消费时按Offset拉取。

核心组件:

1. Broker集群:每个Broker负责若干Partition,通过副本机制保证高可用,Leader负责读写,Follower同步数据。

2. 消费位移管理:Offset存储在内部Topic中,消费者定期提交。Exactly-Once需要事务+幂等配合。

3. 分区策略:按Key哈希保证同一Key的消息有序,无Key则轮询负载均衡。

扩展方案:当单个Partition吞吐不足时,增加Partition数量。跨机房场景可以用MirrorMaker做异步复制。

真题四:设计朋友圈

需求分析:核心功能:发动态、刷朋友圈、点赞评论。关键挑战:写扩散vs读扩散的选择。假设1亿用户,平均每人200好友。

架构设计:我推荐写扩散为主+读扩散为辅的混合方案。普通用户发动态时推送到所有好友的收件箱(写扩散),大V发动态时粉丝主动拉取(读扩散)。

核心组件:

1. Feed流存储:每个用户维护一个Timeline表,按时间倒序排列。用Redis的Sorted Set实现,Score为时间戳。

2. 写扩散服务:发动态后异步扇出写入所有好友的Timeline,用消息队列解耦。

3. 互动服务:点赞评论单独存储,动态详情页实时聚合。

扩展方案:好友数超过5000的大V走读扩散,粉丝拉取时先查缓存再查数据库。冷数据可以降级存储到HBase,降低成本。

真题五:设计搜索引擎

需求分析:核心功能:网页爬取→建立索引→查询返回结果。关键指标:查询延迟<100ms,索引规模百亿级。

架构设计:爬虫→文档存储→倒排索引构建→查询服务四层架构。

核心组件:

1. 倒排索引:Term→DocID列表的映射,是搜索引擎的核心数据结构。用跳表加速多关键词的AND操作。

2. 分片与分布式:索引按DocID分片到多个节点,查询时并行搜索所有分片,合并TopK结果。

3. 排序模型:基础用TF-IDF+PageRank,进阶用机器学习模型(如LambdaMART)做Learning to Rank。

扩展方案:实时索引用NRT(Near Real-Time)机制,每秒刷新一次Segment。冷热分离,热查询结果缓存到Redis。

真题六:设计推荐系统

需求分析:核心功能:根据用户行为推荐感兴趣的内容。关键挑战:召回率、多样性、实时性

架构设计:经典三层架构:召回层→排序层→重排层。召回层从海量候选中筛选千级别,排序层精排到百级别,重排层做多样性和业务规则调整。

核心组件:

1. 多路召回:协同过滤召回、内容召回、热门召回、向量召回(ANN)并行执行,结果合并去重。

2. 特征平台:用户特征、物品特征、上下文特征统一管理,实时特征通过Kafka+Flink流式计算。

3. 排序模型:粗排用双塔模型(低延迟),精排用DIN/DIEN等深度模型(高精度)。

扩展方案:A/B实验平台支持多组实验并行,用分层实验避免流量互斥。冷启动用Explore-Exploit策略平衡探索和利用。

真题七:设计限流器

需求分析:限流器的核心功能:在给定时间窗口内限制请求数量。关键要求:分布式、低延迟、近似准确。

架构设计:限流算法是核心,常见有固定窗口、滑动窗口、令牌桶、漏桶四种。

核心组件:

1. 令牌桶算法:以固定速率往桶里放令牌,请求消耗令牌,桶空则拒绝。优点是允许突发流量,最常用。

2. 滑动窗口日志:记录每个请求的时间戳,统计窗口内请求数。精确但内存消耗大,适合低QPS场景。

3. 分布式限流:用Redis+Lua脚本实现集中式计数,或者用令牌分片方案,每个节点分一部分令牌。

扩展方案:多级限流:网关层全局限流→服务层限流→单机限流。限流后返回429状态码+Retry-After头,客户端友好降级。

真题八:设计分布式缓存

需求分析:分布式缓存的核心功能:KV存储、高吞吐、低延迟。关键挑战:缓存穿透、缓存击穿、缓存雪崩

架构设计:Client→一致性哈希→Cache Node→数据库。一致性哈希解决扩缩容时的数据迁移问题。

核心组件:

1. 一致性哈希:虚拟节点解决数据倾斜问题,每个物理节点对应100-200个虚拟节点。扩容时只影响相邻节点的数据。

2. 缓存策略:LRU/LFU淘汰策略,写策略用Cache-Aside模式(先更新数据库再删缓存),配合延迟双删保证一致性。

3. 防护机制:缓存穿透用布隆过滤器拦截非法查询,缓存击穿用互斥锁防止并发回源,缓存雪崩用随机过期时间打散。

扩展方案:多副本保证高可用,主从同步用异步复制(性能优先)或Raft共识(一致性优先)。热点Key可以做本地缓存+远程缓存二级架构。

心得建议

1. 一定要先问需求,不要上来就画架构图。面试官最看重的是你分析问题的能力,而不是背答案的能力。

2. 掌握一个通用框架:需求澄清→高层设计→深入设计→扩展讨论。这个框架适用于所有系统设计题。

3. 准备几个万能组件:负载均衡、缓存、消息队列、分片策略。这些组件在大部分系统设计中都会用到。

4. 主动讨论trade-off:比如"这里用强一致性会牺牲可用性,我倾向于最终一致性+补偿机制",这种表述非常加分。

5. 画图:系统设计面试一定要画图,不画图等于没讲清楚。建议练习用简单的方块+箭头表达架构。

FAQ

Q:系统设计面试需要准备到什么深度?

A:不需要像写论文一样深入,但要能讲清楚核心组件的选型理由和trade-off。比如为什么选Redis而不是Memcached,为什么用消息队列而不是同步调用。

Q:没有大规模系统经验怎么办?

A:系统设计面试考的是设计思维,不是实际经验。你可以通过阅读论文(如Dynamo、Kafka论文)和技术博客来补充。面试时坦诚说"我没有实际经验,但我的设计思路是……"也没问题。

Q:时间不够怎么分配?

A:需求澄清5分钟,高层设计10分钟,深入设计15-20分钟,扩展5分钟。如果时间紧,优先保证高层设计完整,深入设计挑一个点讲透。

#系统设计#大厂面试#秒杀系统#消息队列#分布式缓存#推荐系统#限流器#短链服务