
1) 【一句话结论】:采用“弹性扩容+流量削峰”双策略,通过动态增加广告服务实例应对QPS激增,结合限流(控制入口流量)与熔断(保护后端服务)机制,确保活动期间系统稳定且用户体验不降级。
2) 【原理/概念讲解】:首先解释QPS(Queries Per Second,每秒请求数),是衡量系统流量的核心指标,活动期间QPS从10万升至50万,相当于“交通流量”从正常到高峰,需扩容(增加“车道”)和限流(控制入口)。
3) 【对比与适用场景】:
| 对比项 | 限流(Rate Limiting) | 熔断(Circuit Breaker) |
|---|---|---|
| 定义 | 控制请求速率,防止服务过载 | 保护后端服务,防止故障扩散 |
| 特性 | 严格按速率限制,可能拒绝合法请求 | 短期拒绝请求,恢复后自动重试 |
| 使用场景 | 活动期间控制入口流量,避免资源耗尽 | 后端服务不稳定时快速隔离 |
| 注意点 | 阈值需合理(过高影响体验,过低无效) | 熔断恢复策略需谨慎(避免误判) |
4) 【示例】(伪代码):
# 广告服务请求处理流程
def handle_ad_request(request):
# 1. 限流检查(令牌桶)
if not token_bucket.consume(1):
return {"code": 429, "msg": "请求太频繁"}
# 2. 熔断检查(状态存储)
if circuit_breaker.is_open():
return {"code": 503, "msg": "服务暂时不可用"}
# 3. 扩容状态检查(K8s HPA)
if is_overloaded():
# 触发扩容(比如调用K8s API增加实例)
scale_service()
# 4. 处理业务逻辑
return process_ad_logic(request)
其中token_bucket是令牌桶实现(每秒10个令牌),circuit_breaker是熔断器(状态存储在Redis),is_overloaded()通过监控QPS/响应时间判断是否超载,scale_service()调用K8s API增加广告服务Pod数量。
5) 【面试口播版答案】:
“面试官您好,针对活动期间QPS激增的问题,我的核心方案是‘弹性扩容+流量削峰’双策略。首先,弹性扩容方面,我会采用Kubernetes的Horizontal Pod Autoscaler(HPA),根据QPS或CPU使用率自动调整广告服务实例数量——比如活动前预置扩容策略,当QPS超过30万时自动增加实例,活动后回缩,确保资源利用率最大化。然后是流量控制,结合限流和熔断:限流用令牌桶算法,每秒控制10万请求(对应平时QPS),活动期间自动提升令牌生成速率(比如每秒50万),避免后端服务过载;熔断则采用断路器模式,当后端响应时间超过500ms或错误率超过50%时,直接返回503,防止请求雪崩。这样既能应对流量激增,又能保证用户体验和系统稳定性。”(约80秒)
6) 【追问清单】:
7) 【常见坑/雷区】: