
1) 【一句话结论】采用分布式架构结合多级缓存、消息队列和分布式锁,通过请求分片、异步处理和最终一致性保障秒杀一致性,同时优化网络和计算资源实现低延迟。
2) 【原理/概念讲解】
老师:咱们先理清核心概念,百万级并发意味着单点无法承载,所以得用分布式架构(微服务拆分、负载均衡)。秒杀场景下,库存扣减是关键,需要分布式锁(比如Redis的SETNX)防止超卖,这是保证一致性的核心。然后,缓存分层很重要:CDN缓存静态资源(如商品图片),Redis缓存热点数据(商品信息、库存快照),数据库是最终数据源,这样能降低数据库压力。消息队列(如Kafka)用于解耦,比如下单后异步更新订单、通知用户,减少实时压力。一致性方面,秒杀允许最终一致性(允许短暂不一致,但需防超卖),所以用缓存+补偿机制,而不是强一致性(强一致性事务开销大,不适合高并发)。
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 强一致性(数据库事务) | 所有节点数据同步 | 严格保证一致性 | 金融交易、核心数据更新 | 事务开销大,不适合高并发 |
| 最终一致性(缓存+补偿) | 允许短暂不一致 | 高并发,低延迟 | 秒杀、抢购等场景 | 需要补偿机制(如重试、异步校验) |
| 分布式锁(Redis vs Zookeeper) | 控制并发访问 | 互斥性 | 库存扣减、秒杀 | Redis锁超时问题,Zookeeper更可靠但复杂 |
4) 【示例】
伪代码示例(用户请求秒杀商品ID=1001):
// API网关负载均衡到后端节点(假设分片到节点1)
// 后端节点流程:
1. 检查Redis缓存(商品信息、库存快照)
2. 获取分布式锁(Redis SETNX "lock:1001" 10s)
3. 若锁获取成功,检查库存(Redis GET "stock:1001")>0:
- 扣减库存(Redis DECR "stock:1001")
- 数据库事务更新订单(商品ID=1001,用户ID=xxx)
4. 释放锁,返回成功
5. 若锁获取失败或库存不足,返回失败
5) 【面试口播版答案】
面试官您好,针对百万级并发游戏商城交易系统,我的设计核心是分布式架构+分层缓存+分布式锁+异步处理,目标是秒杀场景下保证一致性且延迟低。首先,系统拆分为API网关、后端服务、缓存层、数据库层、消息队列层。API网关负责负载均衡和请求分片,比如按商品ID哈希到不同后端节点,避免热点商品集中。缓存层采用CDN+Redis+数据库三层:CDN缓存静态资源,Redis缓存热点商品信息(如价格、库存快照)和用户信息,减少数据库压力。核心模块中,库存扣减通过分布式锁(Redis SETNX)保证互斥,防止超卖。秒杀请求先检查Redis库存快照,若不足则直接返回失败,避免后续竞争。扣库存成功后,异步通过消息队列(如Kafka)通知订单服务创建订单,订单服务再更新数据库。性能优化方面,网络层用CDN就近部署,减少延迟;计算层用多线程处理请求,异步I/O提升吞吐;资源层弹性伸缩,应对流量峰值。一致性方面,秒杀允许最终一致性,但通过分布式锁和库存快照保证一致性,超卖风险低。这样设计既能支撑百万级并发,又能保证秒杀低延迟和高一致性。
6) 【追问清单】
7) 【常见坑/雷区】