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

请设计一个支持百万级并发用户的游戏交易系统(如《三国杀》中的装备购买/出售),需要考虑原子性、数据一致性、防刷/反作弊,并说明关键技术选型(如数据库、缓存、消息队列)。

游卡技术向TA难度:困难

答案

1) 【一句话结论】

微服务拆分(交易、库存、订单、防刷),通过Saga模式实现分布式事务(最终一致性+补偿),结合Redis缓存热点数据、Kafka异步解耦,部署限流、设备指纹、行为分析防刷,通过数据库分库分表支撑百万并发,保障原子性与数据一致性。

2) 【原理/概念讲解】

老师会解释几个核心概念:

  • 原子性:事务的不可分割性,比如购买装备时,扣减库存和创建订单必须一起成功,失败则回滚。类比银行转账,A转B100元,要么全成功(A减100,B加100),要么全失败(都不变),确保数据操作要么全部完成,要么全部不执行。
  • 一致性:数据在所有节点最终一致,比如库存扣减后,订单状态更新,所有服务看到的数据一致。通过分布式事务的补偿机制,解决短暂不一致问题。
  • 分布式事务(Saga模式):由于服务拆分,用最终一致性(允许短暂不一致,通过补偿恢复),比如Saga包含多个步骤(库存扣减、订单创建),每个步骤异步调用,失败时通过补偿事务(如撤销订单、恢复库存)恢复数据一致性,避免强一致性带来的性能损耗。
  • 缓存(Redis):解决热点数据(如热门装备库存、用户余额)的读取压力,通过缓存减少数据库压力。设置过期时间或热点数据预热(提前加载到缓存),避免缓存雪崩。
  • 消息队列(Kafka):解耦服务间的调用,比如订单创建后,发送消息到Kafka,后台异步处理订单(如结算、通知用户),避免服务阻塞,提高系统吞吐量。

3) 【对比与适用场景】

  • 数据库选型:
    | 选型 | 定义 | 特性 | 使用场景 | 注意点 |
    |---|---|---|---|---|
    | MySQL | 关系型数据库 | 高并发读写(分库分表、读写分离)、事务支持 | 交易核心表(订单、库存、用户余额) | 需要分库分表,避免单表数据量过大(如用户ID mod 8分库,订单ID按时间范围分表) |
    | PostgreSQL | 关系型数据库 | 更强数据类型、事务隔离级别、扩展性 | 复杂查询、事务复杂场景(如多表关联、复杂事务) | 学习成本稍高 |
    | TiDB | 分布式数据库 | 横向扩展、强一致性(最终一致性+补偿)、事务支持 | 需要高并发、数据量大的场景(如百万级用户) | 部署复杂,成本较高 |

  • 缓存选型:
    | 选型 | 定义 | 特性 | 使用场景 | 注意点 |
    |---|---|---|---|---|
    | Redis | 内存数据库 | 高性能、支持数据结构(Hash、List)、持久化(RDB/AOF) | 热点数据缓存(库存、余额)、分布式锁、消息队列 | 需要内存,数据量不能过大(如热门装备库存缓存,设置随机过期时间5-10秒) |
    | Memcached | 内存缓存 | 简单键值存储、高性能(无持久化) | 热点数据缓存(非持久化,适合临时数据) | 数据丢失风险,不适合持久化 |

  • 消息队列选型:
    | 选型 | 定义 | 特性 | 使用场景 | 注意点 |
    |---|---|---|---|---|
    | Kafka | 分布式消息队列 | 高吞吐、持久化、分区、副本 | 异步处理(订单结算、通知)、日志、流处理 | 需要集群部署,消息持久化(失败重试) |
    | RabbitMQ | 消息队列 | 队列、交换机、路由 | 解耦服务(任务队列)、延迟队列 | 延迟队列、死信队列(失败消息处理) |

4) 【示例】(购买装备流程伪代码)

用户请求购买装备(装备ID=1,数量=1):
1. 限流(令牌桶算法,每秒100次请求,防止恶意刷单)。
2. 交易服务检查用户余额:
   - 先查询Redis缓存(key: user_balance:uid),若缓存失效(过期或不存在),则查询MySQL数据库(用户表),更新Redis缓存(设置随机过期时间5-10秒)。
3. 库存服务检查库存:
   - 用Redis分布式锁(key: stock_lock:equip_id),加锁成功后,检查Redis缓存(key: stock:equip_id),若库存足够,扣减库存(更新Redis缓存),否则返回库存不足。
4. 订单服务创建订单(数据库事务):
   - 开始事务,插入订单表(订单ID、用户ID、装备ID、数量、状态),更新用户余额(扣减金额),提交事务。
5. 发送消息到Kafka(主题: order_created,消息: {order_id, user_id, equip_id, quantity})。
6. 后台消费者(订单处理服务):
   - 消费Kafka消息,处理订单(如结算、发送通知),若失败(如库存不足或用户余额不足),则发送补偿消息到Kafka(主题: order_compensation),触发补偿事务(撤销订单、恢复库存)。  

5) 【面试口播版答案】

“面试官您好,设计百万级并发游戏交易系统,核心是微服务拆分(交易、库存、订单、防刷服务),通过Saga模式实现分布式事务(最终一致性+补偿),结合Redis缓存热点数据(如热门装备库存)和Kafka异步解耦,并部署IP限流、设备指纹(设备ID+浏览器指纹+操作系统+屏幕分辨率)、行为分析(购买频率阈值,如每分钟5次购买则限流)等防刷措施。具体来说,购买流程中,先限流,检查用户余额(缓存失效则数据库查询),库存扣减用Redis分布式锁,扣减成功后更新数据库,订单服务事务创建订单并更新余额,最后发送Kafka消息,后台消费者处理订单,失败则补偿。数据库按用户ID哈希分库(如用户ID mod 8分库),订单ID按时间范围分表(每天分表),缓存设置随机过期时间5-10秒,消息队列重试3次,失败入死信队列。这样既能支撑百万并发(QPS达10万,响应延迟小于200ms),又能保证数据一致性和防作弊。”

6) 【追问清单】

  • 问题1:分布式事务的补偿事务如何触发?
    回答要点:失败消息通过Kafka发送到补偿主题,消费者监听并执行补偿事务(如撤销订单、恢复库存)。
  • 问题2:缓存雪崩如何处理?
    回答要点:设置随机过期时间(5-10秒),并定期预热热门数据(每分钟加载热门装备库存到Redis)。
  • 问题3:消息队列的重试策略?
    回答要点:重试3次,间隔1秒,失败则发送到死信队列,人工干预处理。
  • 问题4:防刷措施如何应对恶意用户绕过(如换IP、设备)?
    回答要点:IP黑名单、设备黑名单(设备指纹识别),行为分析后自动封禁(如购买频率超过阈值)。

7) 【常见坑/雷区】

  • 坑1:直接用全局事务(两阶段提交):性能低,不适合高并发,导致服务阻塞,影响用户体验。
  • 坑2:缓存未加过期或预热:导致缓存雪崩,大量请求打到数据库,系统崩溃。
  • 坑3:消息队列未考虑重试和死信:失败订单堆积,影响订单处理,用户投诉。
  • 坑4:防刷措施简单:被恶意用户绕过(如换IP、设备),导致刷单行为,影响游戏公平性。
  • 坑5:一致性协议选择错误:强一致性(如两阶段提交)导致性能下降,最终一致性未补偿,数据不一致。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1