burst参数设置突发请求缓冲队列长度,允许超额请求排队并按rate节奏延迟处理,队列满时返回503;配合nodelay可立即处理burst内请求但透支令牌。

在 Nginx 中,limit_req 的 burst 参数用于设置突发请求的缓冲队列长度,它允许在限流阈值之外暂时接受一定数量的额外请求,这些请求会被排队并按限速节奏(由 rate 决定)逐个处理。关键在于:它不是“放行”,而是“延迟执行”——超出速率的请求会进入队列等待,若队列满则直接返回 503。
burst 的作用机制
burst 配合 rate 实现“令牌桶”式限流:
- rate 定义每秒生成多少个“令牌”(即允许通过的请求数)
- burst 是令牌桶的容量上限,即最多可暂存多少个未及时消耗的令牌
- 每个请求需消耗一个令牌;无令牌时,若队列未满就入队,否则拒绝(503)
- 队列中的请求按令牌生成节奏被“释放”,所以实际响应会有延迟
基本配置写法与含义
在 http、server 或 location 块中使用:
limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;
location /api/ {
limit_req zone=perip burst=10 nodelay;
}
说明:
-
rate=5r/s:每秒最多处理 5 个请求 -
burst=10:允许最多 10 个请求排队等待 -
nodelay:不延迟执行,即 burst 内的请求立即处理(但会透支令牌,后续会以更快节奏补扣) - 不加
nodelay(默认行为):burst 中的请求会按时间戳排队,依次延后响应(例如第 6 个请求可能等 200ms 才处理)
burst 和 nodelay 的实际影响对比
假设 rate=5r/s、burst=5,1 秒内来了 10 个请求:
- 不加 nodelay:前 5 个立即响应;后 5 个入队,分别在第 1.2s、1.4s、1.6s、1.8s、2.0s 时响应(均匀摊开)
- 加 nodelay:10 个全部立即响应,但 Nginx 会在后台以 5r/s 补扣“欠账”,导致接下来 1 秒内再来的请求大概率被限(因令牌已用完)
注意:nodelay 不是取消限流,而是把延迟转移到后续请求上,适合对首包延迟敏感、能容忍后续抖动的场景(如前端轮询接口)。
常见误用与建议
以下配置容易引发问题:
-
burst设得过大(如burst=1000):队列积压严重,用户感知明显延迟,还可能耗尽连接或内存 - 只设
burst不设rate:无效,rate 是必需参数 - 在高并发入口盲目加
nodelay:可能把瞬时压力放大成持续超载,压垮上游服务 - 未配合
limit_req_status自定义错误码:默认 503 不友好,建议设为 429 并返回 Retry-After
推荐做法:先用小 burst(如 3–10)+ 无 nodelay 观察日志;再根据平均响应时间和业务容忍度微调;对关键接口单独限流,避免全局一刀切。


















