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

设计一个针对Web服务的高并发请求限流方案,说明限流策略(如令牌桶/漏桶)、实现方式(如Redis)、如何避免误伤正常用户。

360安全开发初级工程师难度:中等

答案

1) 【一句话结论】针对Web服务高并发请求,采用令牌桶算法结合Redis实现限流,通过动态调整令牌生成速率控制请求速率,并配合熔断降级机制,避免误伤正常用户。

2) 【原理/概念讲解】限流是为了防止系统因过载崩溃,核心是控制请求进入服务器的速率。令牌桶(Token Bucket)和漏桶(Leaky Bucket)是两种经典策略:

  • 令牌桶:维护一个固定容量的桶,按固定速率生成令牌(如每秒10个),请求消耗令牌通过;若桶空则等待(或拒绝,避免突发流量冲击)。类比:自动贩卖机,每秒投币(令牌)10次,用户按需取货(请求),投币速率不够则等待。
  • 漏桶:请求先进入漏桶,按固定速率(如每秒5个)流出,多余请求丢弃。类比:漏斗,水流(请求)流入后,按漏斗孔径(速率)流出,流入太快则溢出(丢弃)。
    令牌桶更适合突发流量(可累积令牌应对短时间高流量),漏桶更严格(按固定速率处理请求,适合流量平稳场景)。

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) 【追问清单】

  • 问:限流阈值(如每秒100请求)如何确定?
    答:通过历史流量数据(7天平均QPS)、系统资源(CPU、内存)负载,结合业务需求(如秒杀峰值),用经验公式(如QPS = 系统资源利用率×1.5)计算。
  • 问:如何处理突发流量(如秒杀时流量激增)?
    答:令牌桶的累积特性可应对,但需结合熔断,当流量超阈值3秒,触发熔断,直接返回错误,避免系统崩溃。
  • 问:限流粒度(按IP/用户/接口)如何选择?
    答:按IP或用户维度限流更合理,避免接口限流误伤正常用户(如用户刷新页面)。
  • 问:如何避免缓存穿透?
    答:令牌桶key用唯一标识(用户/IP),不会缓存穿透(每次请求生成唯一key)。
  • 问:限流和熔断的区别?
    答:限流控制速率,防止过载;熔断降级,当系统过载时直接拒绝请求,避免雪崩。两者结合更有效。

7) 【常见坑/雷区】

  • 误伤正常用户:固定速率限流可能导致正常用户被限流,需动态调整或按用户维度限流。
  • 限流粒度过细:按接口限流可能影响正常业务,应按用户/IP维度。
  • 缓存雪崩:Redis缓存失效时,需用Lua脚本确保原子性,避免大量请求访问数据库。
  • 突发流量处理:漏桶可能丢弃过多请求,令牌桶可能等待,需根据业务场景选择。
  • 熔断与限流混淆:限流是控制速率,熔断是降级,不能替代,需结合使用。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1