
微服务拆分(交易、库存、订单、防刷),通过Saga模式实现分布式事务(最终一致性+补偿),结合Redis缓存热点数据、Kafka异步解耦,部署限流、设备指纹、行为分析防刷,通过数据库分库分表支撑百万并发,保障原子性与数据一致性。
老师会解释几个核心概念:
数据库选型:
| 选型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| MySQL | 关系型数据库 | 高并发读写(分库分表、读写分离)、事务支持 | 交易核心表(订单、库存、用户余额) | 需要分库分表,避免单表数据量过大(如用户ID mod 8分库,订单ID按时间范围分表) |
| PostgreSQL | 关系型数据库 | 更强数据类型、事务隔离级别、扩展性 | 复杂查询、事务复杂场景(如多表关联、复杂事务) | 学习成本稍高 |
| TiDB | 分布式数据库 | 横向扩展、强一致性(最终一致性+补偿)、事务支持 | 需要高并发、数据量大的场景(如百万级用户) | 部署复杂,成本较高 |
缓存选型:
| 选型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Redis | 内存数据库 | 高性能、支持数据结构(Hash、List)、持久化(RDB/AOF) | 热点数据缓存(库存、余额)、分布式锁、消息队列 | 需要内存,数据量不能过大(如热门装备库存缓存,设置随机过期时间5-10秒) |
| Memcached | 内存缓存 | 简单键值存储、高性能(无持久化) | 热点数据缓存(非持久化,适合临时数据) | 数据丢失风险,不适合持久化 |
消息队列选型:
| 选型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Kafka | 分布式消息队列 | 高吞吐、持久化、分区、副本 | 异步处理(订单结算、通知)、日志、流处理 | 需要集群部署,消息持久化(失败重试) |
| RabbitMQ | 消息队列 | 队列、交换机、路由 | 解耦服务(任务队列)、延迟队列 | 延迟队列、死信队列(失败消息处理) |
用户请求购买装备(装备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),触发补偿事务(撤销订单、恢复库存)。
“面试官您好,设计百万级并发游戏交易系统,核心是微服务拆分(交易、库存、订单、防刷服务),通过Saga模式实现分布式事务(最终一致性+补偿),结合Redis缓存热点数据(如热门装备库存)和Kafka异步解耦,并部署IP限流、设备指纹(设备ID+浏览器指纹+操作系统+屏幕分辨率)、行为分析(购买频率阈值,如每分钟5次购买则限流)等防刷措施。具体来说,购买流程中,先限流,检查用户余额(缓存失效则数据库查询),库存扣减用Redis分布式锁,扣减成功后更新数据库,订单服务事务创建订单并更新余额,最后发送Kafka消息,后台消费者处理订单,失败则补偿。数据库按用户ID哈希分库(如用户ID mod 8分库),订单ID按时间范围分表(每天分表),缓存设置随机过期时间5-10秒,消息队列重试3次,失败入死信队列。这样既能支撑百万并发(QPS达10万,响应延迟小于200ms),又能保证数据一致性和防作弊。”