限流规则里的突发额度与不延迟参数各自改变什么,排队还是拒绝由谁定
限流规则里的突发额度与不延迟参数各自改变什么,排队还是拒绝由谁定?简短回答:速率参数决定稳态放行节奏;突发额度(burst)决定超额请求里有多少能进入等待;不延迟参数(nodelay)决定进入等待的请求要不要立刻处理;至于单个请求最终是排队还是被拒绝,由它到达时等待中的请求数是否已经超过 burst 上限决定。下面以 nginx 官方文档对限流模块的说明为准,把这几个参数逐项拆开。
限流到底限在哪一层?
限流的统计对象是键,不是路径。官方文档的定位是:该模块按定义的键限制请求处理速率,典型用途是限制来自单个 IP 的请求速率,实现方式是漏桶。这意味着同一个键共享同一份额度:键选成 IP,同一出口 IP 后面的多个真实用户会互相挤占;键选得过细,限制又容易被分散绕开。选键是限流配置里影响最深远的一个决定,动手前先想清楚限制的粒度到底是”每个访客”还是”每个调用来源”。
burst 改变的是什么?
按官方示例,rate 设为每秒 1 个请求、burst 设为 5 的含义是:平均每秒放行 1 个请求,之外允许不超过 5 个请求作为突发。超额请求不会立刻被拒,而是被延迟处理;只有当等待中的超额请求数量超过 burst 上限时,请求才被终止并按设定状态码返回。所以 burst 不是缓存池的容量,也不是吞吐上限,它描述的是允许多少超额请求排队等待。把 burst 调大,站点能容纳更久的突发,但每个排队的请求等待时间也更长,客户端超时的风险随之上移。
nodelay 与 delay 各自改变什么?
不加参数时,进入队列的超额请求一律延迟到桶里腾出空间才处理。nodelay 的作用是让超额请求不排队:仍然占用突发额度,但立即处理,额度用完即拒。delay 则是两者之间的折中:按官方文档,delay 参数设定超额请求从第几个开始被延迟,默认值为 0,即所有超额请求都延迟;设为非零时,前面一部分超额请求立即处理,之后的才进入等待。三者的差别不在能放行多少请求,而在放行的那些请求以什么节奏被处理。
排队还是拒绝由谁定?
单个请求的命运由两个开关共同决定:到达时队列是否已满,决定排队还是拒绝,这是 burst 画出的边界;被拒时返回什么,由返回码指令设定,不配置时按默认状态码返回。调试阶段还有第三个开关:dry-run 模式开启后不真拦截,只在共享内存里照常记账,适合上线前观察真实流量里有多少请求会命中限额。推荐的调参顺序是先开 dry-run 观察键的命中分布,再定速率与 burst,最后根据业务对延迟的容忍度决定要不要 nodelay。
| 参数 | 改变什么 | 不改变什么 |
|---|---|---|
| rate | 稳态放行速率 | 突发容量 |
| burst | 允许排队的超额请求数 | 稳态速率 |
| nodelay | 排队请求改为立即处理 | 突发容量与拒绝边界 |
| delay=N | 前 N 个超额请求免于延迟 | 突发容量 |
| dry-run | 只记账不拦截 | 记账口径 |
| 返回码指令 | 被拒请求的响应状态 | 拦截行为本身 |
常见问题
问:把 burst 调大是不是就能抗住高频请求? 答:burst 只是让超额请求排队等待,超过上限照样拒绝;面对持续的高频请求,更大的 burst 只会拉长正常请求的等待时间。
问:键应该选 IP 还是别的? 答:取决于要限制的对象。限单个访客选 IP 一类标识,限接口调用方选账号或凭据标识;选错键会让限额作用到不该作用的人群。
问:怎么验证规则生效了? 答:先开 dry-run 观察命中计数,再切回拦截模式,并把返回码设成便于识别的值,客户端日志里就能把限流拒绝和其他错误分开。