
1) 【一句话结论】
设计高并发游戏交易系统,核心是通过微服务拆分(交易、库存、订单服务),采用Saga模式实现分布式事务保证交易原子性,结合布隆过滤器防缓存穿透、分布式锁防并发、缓存过期时间随机化防雪崩,以及数据库分库分表,支撑百万级并发并确保数据一致性。
2) 【原理/概念讲解】
老师解释:百万用户同时交易需水平扩展。原子性指交易全流程(如扣减库存、创建订单)不可分割,失败需回滚(库存扣减失败则订单不创建)。
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 布隆过滤器 | 位图结构,判断元素是否存在于集合 | 确定否定(无则一定不存在),可能误报(误报率约1%左右,可通过增加位数降低) | 查询不存在的数据(如虚拟物品ID不存在) | 不能存储数据,需配合缓存 |
| 缓存空值+互斥锁 | 存储空值,加锁重试 | 防穿透,但锁竞争 | 高并发下查询不存在的数据 | 锁竞争可能导致性能下降 |
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 最终一致性(Saga) | 分步骤执行,失败补偿 | 成本低,适合高并发(如游戏交易,库存扣减失败订单不创建,允许最终一致性) | 交易、库存、订单等步骤 | 需监控补偿失败,人工干预 |
| 强一致性(两阶段提交) | 全局事务,一步完成 | 数据一致性高(如金融,库存扣减失败订单需删除,不允许最终一致性) | 金融等强一致性要求场景 | 性能低,不适合高并发 |
4) 【示例】
交易服务购买物品流程(含布隆过滤器检查、分布式锁、Saga补偿,消息队列ACK机制):
# 交易服务:购买物品
def buy_item(user_id, item_id, count):
# 1. 检查布隆过滤器(防穿透,误报率约1%)
if not bloom_filter.contains(item_id):
return "item not exist"
# 2. 加分布式锁(Redis SETNX,10秒过期,避免死锁)
lock_key = f"inventory:{item_id}:lock"
if not redis.setnx(lock_key, 1, ex=10):
return "lock failed, retry"
try:
# 3. 扣减库存(数据库更新)
db.update("inventory", {"stock": stock - count}, where="id=?")
# 4. 创建订单(消息队列,带ACK确认)
order_msg = {"user_id": user_id, "item_id": item_id, "count": count, "status": "pending"}
mq.publish("order.create", order_msg)
# 5. 释放锁
redis.delete(lock_key)
return "transaction success"
except Exception as e:
# 6. 发送补偿消息回滚库存(消息队列,重试3次,失败人工介入)
mq.publish("inventory.rollback", {"item_id": item_id, "count": count}, retry=3)
redis.delete(lock_key)
return "transaction failed, inventory rolled back"
# 库存服务:处理补偿消息(带幂等性)
def handle_inventory_rollback(msg):
item_id = msg["item_id"]
count = msg["count"]
# 幂等性检查(订单号)
order_id = msg.get("order_id", None)
if not order_id:
return "invalid message"
# 执行回滚
db.update("inventory", {"stock": stock + count}, where="id=?")
5) 【面试口播版答案】
面试官您好,设计高并发游戏交易系统,核心是通过微服务拆分(交易、库存、订单服务),采用Saga模式实现分布式事务保证交易原子性,结合布隆过滤器防缓存穿透、分布式锁防并发、缓存过期时间随机化防雪崩,以及数据库分库分表,支撑百万级并发并确保数据一致性。具体来说:
6) 【追问清单】
7) 【常见坑/雷区】