如何处理一个高并发的需求
这道题一般不会要你背 QPS 数字,而是看你怎么分层拆解:先估流量、找瓶颈,再按「能挡则挡、能拆则拆、能异步则异步」往下落。我按面试时口述的顺序写,偏后端场景,前端和网关也会带到。
题目
如何处理一个高并发的需求?(例如秒杀、大促下单、热点接口被打满)
参考答案(口述要点)
- 先量化:峰值 QPS、读写比、是否热点 key、能否接受最终一致
- 入口治理:CDN 静态资源、网关限流、验证码/排队页挡一层
- 读多写少:多级缓存(本地 + Redis)、读写分离、热点数据预热
- 写路径:异步化(MQ 削峰)、库存预扣/分段、幂等与去重
- 保护下游:连接池、超时熔断、降级兜底页
- 观测与压测:全链路压测找瓶颈,上线后看 P99、错误率、慢 SQL
详细解析
第一步:别急着上技术,先对齐需求
| 问题 | 为什么问 |
|---|---|
| 峰值多少?持续多久? | 决定要不要上 MQ、要不要独立集群 |
| 读多还是写多? | 读 → 缓存;写 → 队列、分库 |
| 必须强一致吗? | 秒杀库存可以短暂不一致,支付不行 |
| 热点是全局还是个别 SKU? | 全局热点要拆分 key、本地缓存 |
面试官想听的是你有节奏,不是一口气报十个名词。
整体架构思路
常见手段分层
| 层级 | 手段 | 典型场景 |
|---|---|---|
| 接入 | CDN、WAF、验证码 | 静态页、防刷 |
| 网关 | 令牌桶/漏桶限流、按用户/IP 限流 | 保护核心 API |
| 应用 | 水平扩容、无状态、线程池调优 | 计算型接口 |
| 缓存 | Redis、本地 Caffeine、热点 key 拆分 | 商品详情、配置 |
| 数据库 | 索引、读写分离、分库分表 | 订单、日志 |
| 异步 | RabbitMQ / Kafka 削峰填谷 | 下单后发短信、写库 |
| 容错 | Sentinel / Resilience4j 熔断降级 | 依赖挂了不拖死主链路 |
秒杀类场景的口述模板
- 前端:按钮置灰、排队页、静态资源 CDN,减少无效请求打到后端。
- 网关:按用户限流,同一用户 1 秒 1 次。
- Redis 预减库存:
DECR或 Lua 保证原子,库存为 0 直接返回,不进 DB。 - MQ 异步创建订单:接口只返回「排队中」,消费者慢慢落库。
- 幂等:
orderId/ 用户+活动维度去重,防止重复下单。
限流示例(概念级)
// Guava RateLimiter 或 Sentinel 注解 —— 面试能说清「在哪一层限」即可
@SentinelResource(value = "createOrder", blockHandler = "blockHandler")
public OrderVO createOrder(CreateOrderRequest req) {
return orderService.create(req);
}网关层(Nginx limit_req、Spring Cloud Gateway RequestRateLimiter)和应用层限流可以叠加,挡在不同位置。
缓存注意点
- 缓存穿透:布隆过滤器 / 空值缓存
- 击穿:热点 key 互斥锁或逻辑过期
- 雪崩:过期时间加随机抖动、多级缓存
这些在 Redis 面试题里也会单考,高并发题里点到即可。
代码与实践
项目里怎么落地(口述素材)
- 读多写少的配置、字典、商品详情:Redis + 合理 TTL;大促前 预热 到缓存。
- 下单、发通知:主流程只写核心表,积分、消息、日志走 MQ,消费者失败重试 + 死信。
- DB 仍是瓶颈时:先
EXPLAIN和慢 SQL 治理,再考虑分库;别没查索引就上中间件。 - 压测:用 JMeter / Gatling 打满再扩容,看是 CPU、连接池还是锁等待先爆。
一段库存预扣的 Redis Lua(面试加分)
-- KEYS[1] 库存 key,ARGV[1] 扣减数量
local stock = tonumber(redis.call('GET', KEYS[1]))
if stock == nil or stock < tonumber(ARGV[1]) then
return 0
end
redis.call('DECRBY', KEYS[1], ARGV[1])
return 1Java 侧用 RedisTemplate.execute(RedisScript) 执行,保证判断和扣减原子。
延伸 / 易错点
- 只堆机器不治理:扩容有效,但热点 key、慢 SQL 线性扩容也救不了。
- 缓存和 DB 双写顺序:先更 DB 再删缓存,或 Canal 订阅 binlog 更新缓存,避免脏读。
- 「高并发」不是越高越好:过度设计增加运维成本,按业务量级选型。
写在最后
面试时先用 1 分钟讲流程(量化 → 挡流 → 缓存 → 异步 → 保护下游),再挑一个你真实做过的点展开(比如大促前缓存预热、下单走 MQ)。比罗列名词更像干过活的人。
创作不易,转载请注明出处和作者。
