51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个电商直播场景下的订单系统,要求支持秒杀、拼团等高并发业务,请阐述系统架构和关键技术点。

快手产品类难度:困难

答案

1) 【一句话结论】采用微服务架构+分布式事务+缓存+消息队列,通过分阶段锁和幂等性设计,保障秒杀、拼团等高并发业务下的订单系统稳定性和一致性。

2) 【原理/概念讲解】
老师:同学们,设计电商直播订单系统,核心是解决“高并发+业务复杂”的问题。首先得理解几个关键概念:

  • 微服务拆分:把系统拆成秒杀服务、订单服务、库存服务、支付服务等,比如秒杀服务专门处理秒杀请求,订单服务负责订单管理,这样每个服务职责单一,便于独立开发、部署和扩容。
  • 分布式锁:秒杀场景下,同一商品同一时间只能被一个用户抢到,比如用Redis的SETNX命令(原子性设置键值,成功返回1,失败返回0),类似“抢到锁就执行,否则等待”,防止多线程同时操作库存。
  • 缓存策略:为了降低数据库压力,库存数据放在Redis缓存中,但缓存可能失效(缓存雪崩),所以需要缓存预热(提前加载热门商品库存到缓存)和缓存穿透防护(比如布隆过滤器,避免恶意请求直接到数据库)。
  • 消息队列:用户下单后,先发送消息到订单队列,由订单服务异步创建订单,这样解耦下单和支付流程,提高系统吞吐量(比如支付超时,订单不会因为支付失败而丢失)。
  • 幂等性:订单创建接口重复请求不会重复下单,比如通过订单号作为唯一标识,或者数据库事务中的唯一约束(如UNIQUE KEY),避免重复扣费。

3) 【对比与适用场景】

对比维度分布式锁实现方式定义特性适用场景注意点
Redis分布式锁利用Redis的SETNX命令,原子性设置键值,超时时间通过Redis的原子操作实现分布式锁原子性、可重入、支持超时自动释放秒杀、抢购等高并发锁场景需考虑Redis集群可用性,避免单点故障
MySQL行锁在数据库表上设置行级锁,保证同一行数据不被并发修改数据库原生支持行锁事务内原子性,数据库保证一致性库存扣减等需要数据库事务的场景事务开销大,不适合高并发下的快速锁
原子操作(数据库自增)利用数据库的原子性操作(如UPDATE stock SET stock=stock-1 WHERE id=...)无需额外锁,数据库保证原子性无需额外锁,依赖数据库事务库存扣减等简单场景依赖数据库事务,不适合秒杀等复杂流程

4) 【示例】
秒杀请求伪代码(用户请求秒杀商品ID=1001,数量=1):

// 前端发送请求到API网关  
// API网关路由到秒杀服务  
// 秒杀服务逻辑:  
1. 检查Redis缓存库存(key=“stock:1001”)  
   - 若缓存库存>=1,直接返回成功  
   - 否则,查询数据库库存(假设数据库库存=10)  
2. 若数据库库存>=1,尝试Redis分布式锁(key=“lock:1001”,value=当前时间+超时时间)  
   - 若加锁成功:  
     - 执行数据库扣库存(`UPDATE stock SET stock=stock-1 WHERE id=1001`)  
     - 创建订单(`INSERT INTO orders (user_id, product_id, quantity) VALUES (1,1001,1)`)  
     - 释放锁(`SETNX lock:1001 0`)  
   - 若加锁失败:  
     - 返回失败  
3. 若库存不足,直接返回失败  

5) 【面试口播版答案】
“面试官您好,我来设计一个电商直播场景下的订单系统,核心需求是支持秒杀、拼团等高并发业务。首先,我会采用微服务架构,把系统拆分为秒杀服务、订单服务、库存服务、支付服务等模块,通过API网关统一入口,实现服务解耦和流量分发。

关键技术点方面,首先是分布式锁,秒杀场景下需要保证同一商品同一时间只能被一个用户抢到,这里我会用Redis的SETNX命令实现分布式锁(比如设置key为“秒杀商品ID”,value为当前时间+超时时间),成功则执行后续扣库存和创建订单,失败则直接返回。然后是缓存策略,为了降低数据库压力,库存数据会放在Redis缓存中,同时设置缓存过期时间,并采用缓存预热(提前加载热门商品库存到缓存)和布隆过滤器(避免缓存穿透),避免缓存雪崩。另外,消息队列会用于异步处理订单,比如用户下单后,先发送消息到订单队列,由订单服务异步创建订单,这样可以解耦下单和支付流程,提高系统吞吐量。还有幂等性处理,比如订单创建接口,即使重复请求也不会重复下单,通过订单号作为唯一标识,或者数据库事务中的唯一约束。

系统架构上,秒杀服务负责处理秒杀请求,先检查缓存库存,不足则查询数据库,然后加锁扣减库存并创建订单;订单服务负责订单管理,包括查询、修改、取消等;库存服务负责库存管理,包括扣减、回滚等;支付服务负责支付流程。各服务之间通过RPC或RESTful API通信,API网关负责请求路由、限流和鉴权。

总结来说,这个系统通过微服务拆分、分布式锁、缓存、消息队列等技术,解决了秒杀、拼团等高并发业务下的订单系统稳定性、一致性和性能问题。”

6) 【追问清单】

  • 问题1:如何处理分布式事务?
    回答要点:对于秒杀等需要库存和订单同时成功的场景,采用两阶段提交或Saga模式,比如先扣库存,成功则创建订单,失败则回滚库存。
  • 问题2:秒杀的库存如何保证一致性?
    回答要点:通过分阶段锁(先检查库存,再加锁扣减),结合缓存预热和布隆过滤器,避免缓存穿透和雪崩。
  • 问题3:系统如何扩容?
    回答要点:微服务架构下,各模块可独立扩容,比如秒杀服务在高并发时增加实例,数据库采用分库分表,缓存采用Redis集群。
  • 问题4:如何监控和调优?
    回答要点:通过Prometheus+Grafana监控系统指标(如QPS、延迟、缓存命中率),通过日志分析定位问题,通过压测和性能调优优化系统。

7) 【常见坑/雷区】

  • 忽略幂等性导致重复下单:比如订单创建接口没有幂等处理,重复请求会创建多个订单,需通过订单号或唯一约束保证。
  • 缓存雪崩导致数据库压力:没有缓存预热或缓存穿透防护,大量请求直接到数据库,需设置缓存过期时间,并采用布隆过滤器。
  • 分布式锁竞争问题:Redis分布式锁的竞争会导致部分用户抢不到商品,需设置合理的超时时间,并考虑锁的自动续期。
  • 跨库事务问题:秒杀涉及库存和订单两个表,若用数据库事务,会导致性能瓶颈,需采用两阶段提交或Saga模式。
  • 消息队列积压:若订单服务处理速度慢,消息队列会积压,导致订单延迟,需监控队列长度,并增加订单服务实例。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1