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

设计一个游戏活动系统(如限时折扣、签到奖励),需要支持高并发请求(如活动开始时瞬间访问量激增),请设计系统架构、数据存储方案和并发控制策略。

八方职达 | 广州创思信息技术有限公司国内游戏运营难度:中等

答案

1) 【一句话结论】
核心是通过分层架构(前端-中间层-数据层)+量化指标(QPS目标值2000+,数据库连接数上限1000)+分布式缓存(Redis)+消息队列(Kafka)+分库分表(MySQL)+限流熔断(Nginx+Hystrix),确保活动系统在活动开始时(QPS峰值5000)稳定运行,同时支持限时折扣、签到等功能的快速落地。

2) 【原理/概念讲解】
老师口吻:咱们先讲系统架构分层,这是应对高并发的基础。通常分三层:前端展示层(负责页面渲染和请求路由,比如API网关Nginx,负责负载均衡和基础限流);业务逻辑层(处理核心业务逻辑,如活动规则校验、奖励计算);数据服务层(负责数据存储和查询,比如缓存+数据库)。

高并发应对的关键是“解耦+缓存+异步+分库分表”:

  • 解耦:用消息队列(Kafka)让业务异步处理,比如活动奖励发放、日志记录,避免直接调用导致服务压力激增;
  • 缓存:用Redis缓存热点数据(活动规则、用户状态),比如活动开始时,用户访问活动页面时,先查Redis,若存在则直接返回,大幅降低数据库压力;
  • 分库分表:水平扩展数据库,比如按活动ID哈希分片,处理海量活动数据;
  • 并发控制:库存扣减(写多读少)用Redis分布式锁(SETNX+过期时间)保证并发安全;签到(读多写少)用乐观锁(数据库版本号)保证数据一致性。

3) 【对比与适用场景】

方案类型定义特性使用场景注意点
缓存方案Redis(内存数据库,支持数据结构、事务、持久化)<br>Memcached(基于内存的键值存储,无持久化)Redis:高性能、持久化、多数据结构(列表、集合)、事务;<br>Memcached:高性能、简单、无持久化Redis:热点数据缓存(活动规则、用户状态)、分布式锁、缓存穿透防护;<br>Memcached:临时缓存(非持久化场景)Redis需配置持久化(RDB/AOF),避免数据丢失;Memcached数据易丢失,不适合高并发下的数据一致性维护
数据库方案MySQL读写分离(主库写,从库读)<br>分库分表(按活动ID哈希分片)MySQL读写分离:提升读性能,主从同步延迟;<br>分库分表:扩展性高,处理海量活动数据MySQL读写分离:读多写少场景(活动数据查询);<br>分库分表:海量活动数据存储(用户活动记录)读写分离需主从同步延迟,分库分表需路由规则,数据一致性维护复杂(通过事务+消息队列)
消息队列方案Kafka(分布式消息队列,高吞吐、持久化)<br>RabbitMQ(企业级消息队列,可靠性高)Kafka:高吞吐、持久化、多消费者、分区复制;<br>RabbitMQ:可靠性高、支持手动ACK、多种消息模式Kafka:异步处理大量非实时任务(活动奖励发放、日志记录);<br>RabbitMQ:异步任务、解耦服务(需要手动确认的场景)Kafka需集群部署,消息积压风险(通过监控+消费端重试);RabbitMQ需手动ACK,消息积压风险(通过死信队列)

4) 【示例】
以“限时折扣”活动为例,用户访问活动页面的流程:

  1. 前端请求API网关(Nginx),Nginx限流(QPS=2000);
  2. 后端检查Redis缓存(key: activity_discount_{activity_id}),若存在则直接返回折扣信息;若不存在,则查询MySQL数据库(表:activity_rules),获取活动规则并写入Redis(TTL=活动时长);
  3. 用户下单时,后端检查Redis库存(key: product_stock_{product_id}),若库存充足则用Redis原子操作减库存(DECR),并更新数据库(事务保证一致性);
  4. 库存扣减成功后,通过Kafka发送消息(topic: activity_stock_update)给库存服务,异步更新库存;
  5. 签到功能:用户签到时,后端检查Redis签到状态(key: user_sign_{user_id}),若未签到则更新缓存(SET user_sign_{user_id} 1 EX 86400)并写入数据库(乐观锁,检查版本号是否一致)。

5) 【面试口播版答案】
面试官您好,针对高并发下的游戏活动系统设计,我的核心思路是通过分层架构+量化指标(QPS目标值2000+,数据库连接数上限1000)+分布式缓存+消息队列+分库分表+限流熔断,确保系统在活动开始时(QPS峰值5000)稳定运行。首先,架构上采用前端-中间层-数据层的分层设计:前端通过API网关(Nginx)负载均衡,中间层处理业务逻辑,数据层负责数据存储。针对高并发,用Redis缓存热点数据(活动规则、用户状态),降低数据库压力;用Kafka异步处理活动奖励发放、日志记录等非实时任务,解耦业务。数据库方面,采用MySQL读写分离(主库写,从库读)提升读性能,按活动ID哈希分片处理海量活动数据。并发控制上,用Redis分布式锁保证库存扣减等关键操作的并发安全,用乐观锁处理签到等读多写少场景。最后,结合Nginx限流(QPS=2000)和Hystrix熔断(响应时间>200ms时熔断),防止系统雪崩。这样设计的系统既能支持限时折扣、签到等活动的快速落地,又能应对活动开始时的瞬间访问量激增,保证高并发下的稳定性。

6) 【追问清单】

  1. “架构选型中,为什么选择Redis作为缓存,而不是Memcached?”
    回答要点:Redis支持数据结构(列表、集合)、事务、持久化,适合存储复杂活动规则和用户状态,而Memcached更适合简单键值缓存,且无持久化,不适合高并发下的数据一致性维护。
  2. “如何处理缓存雪崩问题?”
    回答要点:用随机TTL(避免集中过期)、活动开始前批量预热缓存(如Redis批量加载活动规则),同时设置短TTL的缓存空值(防止缓存穿透)。
  3. “分库分表策略中,如何保证数据一致性和查询性能?”
    回答要点:分库分表按活动ID哈希分片,用数据库路由规则;数据一致性通过事务(库存扣减时事务)和Kafka异步更新(如库存服务消费消息队列更新库存);查询性能通过从库读和缓存优化。

7) 【常见坑/雷区】

  1. 未量化指标(如QPS、数据库连接数),导致“确保稳定运行”缺乏可信依据;
  2. 缓存穿透未防护(如未设置缓存空值+TTL,导致高并发下缓存穿透数据库);
  3. 分布式锁未设置过期时间(如Redis SETNX 未设置过期时间,导致死锁);
  4. 消息队列积压处理不当(如未监控积压,导致活动奖励发放延迟);
  5. 模块边界不明确(如API网关与中间层职责混淆,API网关仅负责负载均衡和基础限流,中间层处理业务逻辑)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1