
1) 【一句话结论】高并发交易系统设计需围绕原子性、并发控制、数据一致性及操作幂等性四大核心,通过分布式锁控制并发冲突,结合数据库事务或Saga模式保障数据一致性,并引入异步处理与缓存预热优化性能,确保重复购买等操作不重复扣款,系统在高并发下稳定运行。
2) 【原理/概念讲解】老师会解释每个关键概念:
3) 【对比与适用场景】
| 技术手段 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 分布式锁 | 通过分布式系统实现互斥访问,确保同一时间只有一个请求执行关键操作 | 短时间持有,高并发下限流 | 商品秒杀、库存扣减、订单创建等短时操作 | 需设置合理过期时间防死锁;锁竞争可能导致请求延迟 |
| 数据库事务 | ACID保证数据一致性,跨表操作时保证操作原子性 | 支持隔离级别控制并发 | 单库内多表操作(如扣钱、减库存、订单插入) | 隔离级别影响并发性能,长事务可能导致锁竞争 |
| Saga模式(分布式事务) | 通过本地事务+补偿事务保证最终一致性,避免阻塞 | 异步补偿,支持最终一致性 | 跨服务数据一致性(如扣钱、减库存、订单记录,涉及多个服务) | 最终一致性可能延迟,补偿逻辑复杂,需容错设计 |
| 操作幂等性机制 | 确保重复操作结果不变 | 重复执行不影响结果 | 重复购买、刷新页面等场景 | 需结合业务逻辑设计,避免资源错误 |
4) 【示例】(购买流程,结合异步处理与幂等性)
function buyItem(playerId, itemId, amount):
// 1. 幂等性检查:根据订单号或玩家ID+商品ID生成唯一标识,检查缓存或数据库中是否已存在该订单
orderKey = generateOrderKey(playerId, itemId)
if isOrderExist(orderKey):
return "已购买,无需重复操作"
// 2. 分布式锁(Redis SETNX,过期3秒)
if not acquireLock("inventory:lock:" + itemId, 3000):
return "系统繁忙,请稍后重试"
// 3. 检查缓存库存(Redis,动态预热)
cachedStock = getCache("inventory:" + itemId)
if cachedStock < amount:
releaseLock("inventory:lock:" + itemId)
return "库存不足"
// 4. 插入订单(数据库事务,幂等性检查后执行)
startTransaction()
insertOrder(playerId, itemId, amount, orderKey) // 记录订单,生成订单号
commitTransaction()
// 5. 发送消息到消息队列(Kafka/RabbitMQ),异步扣库存
sendToQueue("inventory:decrease", {
"itemId": itemId,
"amount": amount,
"orderKey": orderKey
})
// 6. 释放锁
releaseLock("inventory:lock:" + itemId)
return "购买成功,订单处理中"
消费者(异步扣库存)伪代码:
function consumeInventoryDecrease(msg):
itemId = msg.itemId
amount = msg.amount
orderKey = msg.orderKey
// 检查订单状态,确保是有效订单(幂等性)
if isOrderValid(orderKey):
startTransaction()
updateInventory(itemId, -amount) // 扣减库存
commitTransaction()
updateOrderStatus(orderKey, "completed") // 更新订单状态
else:
log("无效订单,跳过补偿")
5) 【面试口播版答案】
“面试官您好,设计高并发交易系统,核心是保障原子性、并发控制、数据一致性,还要考虑操作幂等性。以《三国杀》购买装备为例,扣玩家金币、减装备库存、记录订单这三个操作必须同时成功,否则会导致金币或库存异常,这需要通过数据库事务(BEGIN...COMMIT...ROLLBACK)实现,保证操作要么全部完成要么全部回滚。当多个玩家同时秒杀同一件装备时,不能同时扣库存,否则会导致超卖,这时候可以用分布式锁(Redis SETNX)来保证同一时间只有一个请求执行库存扣减操作,锁的过期时间设为3秒,防止死锁。另外,数据一致性方面,订单状态和库存状态需要实时同步,除了事务,还可以结合缓存策略,比如用Redis缓存库存(动态预热热门商品库存到缓存,避免频繁查询数据库),布隆过滤器防缓存穿透,设置随机过期时间防雪崩。对于重复购买,通过订单号唯一标识或检查订单状态,确保重复操作不重复扣款。高并发下,引入消息队列异步扣库存,避免同步处理导致请求积压,提升系统吞吐量。总结来说,高并发交易系统需通过分布式锁控制并发冲突,通过事务或Saga模式保证数据一致性,同时优化缓存与异步处理,并设计幂等性机制,确保系统在高并发下稳定运行。”
6) 【追问清单】
7) 【常见坑/雷区】