
1) 【一句话结论】在游戏大促活动开启时,通过前端限流、缓存预热、异步消息队列结合数据库读写分离,成功应对10万+并发请求,系统稳定性提升50%,用户响应时间缩短40%。
2) 【原理/概念讲解】高并发场景下,核心是“限流防过载、缓存减压力、异步解耦、数据库优化”。
3) 【对比与适用场景】以限流算法为例,不同策略对比:
| 算法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 固定窗口 | 每时间窗口固定计数 | 简单,但突发流量时超限 | 流量稳定 | 可能导致突发时超限 |
| 滑动窗口 | 时间窗口动态滑动,计数累加 | 流量平滑,避免突变 | 流量波动大 | 实现复杂 |
| 令牌桶 | 持续生成令牌,请求消耗 | 流量平滑,控制速率 | 需精确速率 | 维护令牌池 |
4) 【示例】假设活动开启请求路径为/activity/start?userId=123,处理逻辑:检查活动状态(Redis缓存)、用户资格(Redis缓存)、发放奖励(异步Kafka)。技术方案:
public String startActivity(String userId) {
// 限流检查(Nginx已处理)
// 检查活动状态(Redis缓存,若不存在,从DB读并缓存)
if (!isActivityActive()) {
return "活动未开启";
}
// 检查用户资格(Redis缓存,若不存在,从DB读并缓存)
if (!isUserQualified(userId)) {
return "用户资格不符";
}
// 发送奖励任务到Kafka
kafkaProducer.send("reward-topic", userId, rewardInfo);
return "活动开启成功,奖励已发放";
}
5) 【面试口播版答案】当时我们公司搞大促活动,用户涌入量突然暴增,比如活动开启瞬间,并发请求达到10万QPS。技术方案上,我们做了三件事:第一,前端用Nginx的滑动窗口限流,控制请求速率,避免系统过载;第二,活动数据提前预热到Redis,减少数据库读压力;第三,奖励发放用异步消息队列(如Kafka),把请求解耦,避免阻塞主线程。遇到的挑战是,数据库写压力太大,导致主库延迟。解决方法是引入读写分离,主库写活动状态,从库读用户资格,同时奖励发放任务由消费者异步处理,这样主线程快速返回,用户感觉响应快。最终效果是,服务稳定,用户满意度提升。
6) 【追问清单】
7) 【常见坑/雷区】