
1) 【一句话结论】
针对百万级用户在线课程预约,系统采用微服务架构,通过请求分片分散压力,结合Redis分布式锁保障库存一致性,利用消息队列异步通知,结合缓存+数据库事务实现最终一致性,平衡高并发与数据一致性。
2) 【原理/概念讲解】
高并发预约场景的核心挑战是用户请求量(百万级)、课程容量限制(防超卖)、实时通知。系统分四层设计:前端API网关(请求分片)、后端预约服务(扣减库存、事务处理)、中间件(分布式锁、消息队列)、数据库(持久化数据)。关键设计点:
SETNX实现跨实例互斥,扣减库存前加锁,防止超卖;锁过期时间设为库存扣减时间+缓冲(如10秒),避免死锁。3) 【对比与适用场景】
| 对比项 | 分布式锁(Redis SETNX) | 数据库行级锁 |
|---|---|---|
| 定义 | 跨实例互斥,通过Redis SETNX命令,第一个成功设置键的实例获得锁。 | 数据库自身事务控制,行级锁保护数据操作。 |
| 特性 | 依赖外部存储,实现简单;锁过期时间可配置;支持高可用。 | 依赖数据库,性能受数据库影响;锁竞争高时可能阻塞。 |
| 使用场景 | 跨服务、跨实例的互斥操作(如课程容量扣减),需要高可用。 | 单服务内的事务控制,或数据库自身的事务隔离。 |
| 注意点 | 锁过期时间设置不当可能导致死锁或超卖;锁竞争高时性能下降。 | 事务隔离级别选择影响性能,行级锁可能导致锁等待。 |
4) 【示例】(伪代码,用户预约流程)
用户发送请求(课程ID: 101,用户ID: 1001)到API网关。
course:capacity:101),若剩余>0:
course:lock:101,value: 1001,过期时间=库存扣减时间+缓冲,如10秒)。UPDATE course SET capacity = capacity - 1 WHERE id = 101; INSERT INTO booking (course_id, user_id, create_time) VALUES (101, 1001, NOW())。booking.success,消息体包含用户ID和课程ID)。DEL course:lock:101)。5) 【面试口播版答案】
“面试官您好,针对百万级用户预约在线课程,我设计的系统核心是采用微服务架构,通过请求分片、分布式锁、异步消息、缓存+数据库事务等手段,实现高并发下的数据一致性。用户请求由API网关按课程ID分片,路由到不同后端实例,避免单点压力。关键模块包括:1. 分布式锁:用Redis的SETNX实现,扣减课程容量前加锁,防止超卖,锁过期时间设为10秒(库存扣减时间+缓冲),避免死锁;2. 异步处理:预约成功后,通过Kafka消息队列通知用户,提升响应速度;3. 缓存与数据库一致性:课程容量存入Redis缓存(读缓存),减少数据库压力,更新时通过消息队列同步,保证最终一致性;4. 数据库事务:预约流程用REPEATABLE READ隔离级别的事务,确保数据一致性。整体架构通过这些技术,平衡了性能与一致性,支持百万级并发。”
6) 【追问清单】
7) 【常见坑/雷区】