Nginx - 限制请求时 nodelay 选项起什么作用?

Nginx - 限制请求时 nodelay 选项起什么作用?

使用 nginxHttpLimitReq模块请求可以通过 IP 进行限制。但是,我不明白“nodelay”选项的作用。

如果限制突发延迟内的超额请求不是必要的,则应该使用nodelay

limit_req   zone=one  burst=5  nodelay;

答案1

文档这里有一个听起来像你想知道的解释:

该指令指定区域(zone)和最大可能的请求突发(burst)。如果速率超过区域中概述的需求,则请求将被延迟,以便以给定的速度处理查询

据我了解,突发请求将被延迟(花费更多时间并等待直到可以处理),如果使用nodelay选项则不使用延迟,并且超额请求将被拒绝并出现 503 错误。

这篇博文档案馆) 很好地解释了 nginx 上的速率限制是如何工作的:

如果你和我一样,你可能想知道爆发到底是什么意思。这里有个窍门:将“爆发”一词替换为“桶”,并假设每个用户都有一个包含 5 个令牌的桶。每当他们超过每秒 1 个请求的速率时,他们就必须支付一个令牌。一旦他们用完了所有的令牌,他们就会收到 HTTP 503 错误消息,这基本上已经成为“退后,伙计!”的标准。

答案2

总结:如果您想施加速率限制而不限制请求之间的允许间隔,则 nodelay 选项很有用。

我很难消化其他答案,然后我发现了 Nginx 的新文档,其中的示例回答了这个问题:https://www.nginx.com/blog/rate-limiting-nginx/

以下是相关部分。已知:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

location /login/ {
  limit_req zone=mylimit burst=20;
  ...
}

burst 参数定义客户端可以发出多少个超出区域指定速率的请求(对于我们的示例 mylimit 区域,速率限制为每秒 10 个请求,或每 100 毫秒 1 个请求)。在前一个请求之后 100 毫秒内到达的请求将被放入队列中,这里我们将队列大小设置为 20。

这意味着,如果同时有 21 个请求从给定 IP 地址到达,NGINX 会立即将第一个请求转发到上游服务器组,并将剩余的 20 个请求放入队列中。然后,它每 100 毫秒转发一个排队请求,并且只有当传入请求使排队请求数超过 20 时,才会向客户端返回 503。

如果添加nodelay:

location /login/ {
  limit_req zone=mylimit burst=20 nodelay;
  ...
}

使用 nodelay 参数,NGINX 仍会根据 burst 参数在队列中分配插槽并施加配置的速率限制,但不会通过间隔转发排队请求来做到这一点。相反,当请求“太早”到达时,只要队列中有可用的插槽,NGINX 就会立即转发它。它会将该插槽标记为“已占用”,并且不会释放它以供其他请求使用,直到经过适当的时间(在我们的示例中,100 毫秒后)。

答案3

我的看法如下:

  1. 请求将以最快的速度得到处理,直到超出区域速率。区域速率是“平均”的,因此如果您的速率是1r/s突发的,10您可以在 10 秒内收到 10 个请求。

  2. 超出区域速率后:

    a. 如果没有nodelay,则至 的进一步请求burst将被延迟。

    b. 有了nodelay,以后的请求burst将尽快得到处理。

  3. 超过后burst,服务器将返回错误响应,直到突发窗口过期。例如对于速率1r/s和突发10,客户端将需要等待最多 10 秒才能接受下一个请求。

答案4

我第一次读到https://www.nginx.com/blog/rate-limiting-nginx/

现在我确信我明白了,而且我的答案是迄今为止最好的。:)

假设:10r/s设置了,服务器的最大容量为,例如10000r/s10r/ms并且此刻只有 1 个客户端。

这就是10r/s per IP burst=40 nodelay和之间的主要区别10r/s per IP burst=40

在此处输入图片描述

作为https://www.nginx.com/blog/rate-limiting-nginx/记录(我强烈建议先阅读这篇文章(除了两阶段速率限制部分),此行为修复了一个问题。哪一个?:

在我们的示例中,队列中的第 20 个数据包等待 2 秒才被转发,此时对它的响应可能对客户端不再有用。

查看我做的草稿,一个40th请求在 得到响应,1s而另一个请求40th在 得到响应4s

这可以充分利用服务器的功能:尽快发回响应,同时仍然保持对x r/s给定客户端/IP 的约束。

但这里也有成本。成本将是:

如果服务器上有许多客户端排队,假设客户端ABC

如果没有nodelay,请求的服务顺序类似于ABCABCABC
有了nodelay,顺序更可能是AAABBBCCC


我想总结一下这篇文章https://www.nginx.com/blog/rate-limiting-nginx/这里。

首先,最重要的配置是x r/s

  1. x r/s只是,多余的请求会被立即拒绝。

  2. x r/s+ burst,多余的请求将排队。

1.相比之下2.,代价是在客户端,排队的请求占用了以后的请求获得服务的机会。

例如10r/s burst=20vs 10r/s11th在后一种情况下,请求应该立即被拒绝,但现在它已排队并被服务。该11th请求占用了21th请求的机会。

  1. x r/s++ burstnodelay已经解释过了。

附言两阶段速率限制文章的这一部分非常令人困惑。我不明白,但这似乎并不重要。

例如:

使用此配置,以 8 r/s 的速度发出连续请求流的客户端将遇到以下行为。

8 r/s?真的吗?图中显示 3 秒内有 17 个请求,17 / 3 = 8?

相关内容