limit_req实现平滑限流需协同burst与nodelay:burst提供弹性缓冲(非并发上限),nodelay控制是否排队(非取消限流);典型配置如静态资源用burst=15 nodelay,详情页用burst=80,支付回调用burst=8 nodelay,并须配套日志与监控验证。

要让 limit_req 真正实现“平滑限流整形”,关键不是堆参数,而是理解 burst 和 nodelay 各自的定位与协同逻辑:burst 提供弹性缓冲空间,nodelay 决定这个空间里的请求是否排队。两者组合,才能在“不伤用户体验”和“不压垮后端”之间取得平衡。
burst 是缓冲窗口,不是并发上限
burst 定义的是令牌桶最多能暂存多少个“待处理请求”,但它不加快处理速度。例如:
-
rate=20r/s + burst=40:每秒稳定放行 20 个请求,同时允许最多 40 个请求排队等待; - 这 40 个排队请求仍按 20r/s 节奏匀速放出,平均等待时间约 2 秒(40 ÷ 20),不会集中冲击后端;
- 若 burst 设得过大(如 1000),用户可能等几十秒才收到响应,违背低延迟 SLA。
nodelay 是即决开关,不是取消限流
nodelay 的作用是关闭排队行为,把“等令牌”变成“查余量”:
- 不加 nodelay:超速请求进队列,延迟升高,但后端压力平稳;
- 加 nodelay:只要桶里还有余量(由 burst 定义),就立刻放行;没余量则直接 503;
- 单独写
nodelay无效,必须搭配burst才生效; - 它不提升吞吐量,只避免突发带来的延迟累积。
典型平滑整形组合推荐
不同业务场景需要不同的“平滑”定义,以下是经过验证的配置思路:
-
静态资源加载(JS/CSS/图标):
limit_req zone=static burst=15 nodelay;—— 浏览器并发请求集中到达时,用 burst 提供的瞬时弹性快速响应,不排队拖慢页面渲染; -
商品详情页(读多写少):
limit_req zone=detail burst=80;(不加 nodelay)—— 允许短时热点排队,保持响应节奏连贯,后端压力更可控; -
支付回调、风控校验等强实时接口:
limit_req zone=critical burst=8 nodelay;—— 拒绝长队列等待,保障事务时效性,需前端配合退避重试; -
健康检查或探针请求:用
if或map跳过限流,避免探测流量挤占真实用户配额。
必须配套的验证手段
启用 burst+nodelay 后,行为从“延后失败”变为“即时失败”,没有日志就等于盲操作:
- 在
log_format中加入$limit和$limit_key,可明确看到哪个 key 触发了限流; - 对 nodelay 场景,建议用
error_page 503统一返回 429,并附带 JSON 提示,提升客户端可观察性; - 上线后通过监控
limit_req拒绝率、平均等待时间(有 burst 无 nodelay 时)、503 响应占比,交叉验证是否符合预期。


















