
1) 【一句话结论】针对Web服务高并发请求,采用令牌桶算法结合Redis实现限流,通过动态调整令牌生成速率控制请求速率,并配合熔断降级机制,避免误伤正常用户。
2) 【原理/概念讲解】限流是为了防止系统因过载崩溃,核心是控制请求进入服务器的速率。令牌桶(Token Bucket)和漏桶(Leaky Bucket)是两种经典策略:
3) 【对比与适用场景】
| 策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 令牌桶 | 维护固定容量桶,按速率生成令牌,请求消耗令牌通过 | 可累积令牌,应对突发流量,请求等待 | 电商秒杀、登录验证(需应对突发流量) | 需合理设置令牌生成速率,避免过载 |
| 漏桶 | 请求按固定速率流出,多余请求丢弃 | 严格按速率处理请求,流量平稳 | 网络带宽控制(需严格限制流量速率) | 丢弃多余请求,可能损失部分流量 |
4) 【示例】用Redis实现令牌桶(伪代码):
令牌桶key:rate_limiter:user:ip:port,容量1000,生成速率100(每秒100令牌)。
请求时调用Redis Lua脚本(原子操作):
local capacity = 1000
local rate = 100
local key = "rate_limiter:user:" .. user_id .. ":" .. ip .. ":" .. port
local now = redis.call('time')[1]
local expire = now + 1
local current = redis.call('get', key) or 0
if current > 0 then
local new = current - 1
redis.call('setex', key, expire, new)
return true -- 有令牌,通过
else
return false -- 无令牌,拒绝
end
请求时若脚本返回true则处理请求,否则返回403(拒绝请求)。
5) 【面试口播版答案】各位面试官好,针对Web服务高并发请求的限流方案,核心是采用令牌桶算法结合Redis实现,具体来说:
首先,限流策略选令牌桶,因为它能应对突发流量(通过累积令牌平滑请求速率)。实现上,用Redis原子操作(Lua脚本)维护令牌桶,每个用户/IP/端口对应一个key,容量设为1000,每秒生成100个令牌(速率)。请求时检查key的令牌数,有则通过,否则拒绝。
为了避免误伤正常用户,采用动态调整策略:比如根据系统负载(CPU、QPS)动态调整令牌生成速率,或按用户/IP维度限流(避免接口限流误伤正常用户)。另外,配合熔断降级,当限流触发时,后续请求直接返回错误,减少系统压力。这样既能控制流量,又能保证正常用户的请求及时处理。
6) 【追问清单】
7) 【常见坑/雷区】