用“nodelay”选项定义“burst”是什么意思?

Nic*_*las 16 nginx rate-limiting

在 Nginx 配置中,当你想通过使用limit_req_zone/来限制请求处理速率时limit_req instructions,我不太明白该nodelay选项的用途。
在我的理解中,它会在不延迟它们的情况下终止超过定义速率的请求。所以它似乎相当于burst=0. 这就是为什么我不理解以下示例的原因:

limit_req zone=one burst=5 nodelay;
Run Code Online (Sandbox Code Playgroud)

burst定义了可以延迟的请求数量,那么定义burst是否有nodelay选项是什么意思?

Ber*_*set 29

我发现limit_req文档足够清楚。

burst 是这样记录的:

过多的请求会被延迟,直到它们的数量超过最大突发大小 [...]

nodelay 是这样记录的:

如果不希望在限制请求时延迟过多请求,则应使用参数 nodelay

请求仅限于符合定义的速率。如果请求以更高的速率传入,则不会为每个时间单位提供超过定义数量的请求。然后,您需要决定如何处理这些其他请求。

  • 默认情况下(no burst, no nodelay),请求会被拒绝并出现 HTTP 503 错误。
  • 使用burst,您可以在等待队列中堆叠定义数量的请求,但处理它们的速度不会比单位时间单位速率定义的请求更快
  • 使用burstand nodelay,队列不会等待,请求突发将立即得到处理

  • 感谢您的澄清,文档对我来说还不够清楚。 (3认同)
  • 那么`limit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; 有什么区别?limit_req zone=flood burst=0;` 每秒允许 6 个请求,`limit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;` 这也允许每秒 6 个请求? (3认同)
  • 这个答案让我觉得自己很愚蠢。所以我只是测试了1r/s的速率限制。突发50的情况下,如果我并发发送100个请求,我会被拒绝50个请求,另外50个请求每秒一个接一个地完成。添加“nodelay”后,50 个仍然会被拒绝,由另外 50 个同时完成而不是一个接一个地完成。 (3认同)
  • 只是想确认一下伯纳德的回答。如果伯纳德说的是对的,使用burst和nodelay,网络服务器的命中率会时不时地超过定义的请求,对吧? (2认同)
  • @BernardRosset 你能否澄清“队列不会等待”——你是什么意思? (2认同)

小智 10

通过burstandnodelay指定,我发现更容易理解这样的机制(与通常理解的相反):

  1. 您允许的请求数量上限burst。这$binary_remote_addr是您从给定地址接受的最大请求数。每个请求都会增加一个内部计数器。当计数器达到该值时,burst所有其他请求都会被拒绝(并且计数器不会增加到超出burst值)。
  2. 该计数器以使用 指定的速率连续减少rate

这种逻辑表明,指定一个高burst值(例如 100 或更高)和一个低值rate(甚至类似于 2r/s)是非常有意义的。这可以更好地处理正常浏览(一批并行请求,然后是一段安静期),同时防止持续的机器人请求流。


小智 8

对原始答案的评论似乎是错误的。

手头的问题是有什么区别,比如 rate=6r/s burst=0 和 rate=1r/s burst=5 nodelay

答案很好地解释了当 nodelay 选项不存在时的差异——在这种情况下,请求与突发一起排队,并且在没有突发的情况下是 503'd。

原始答案似乎是正确的 - 使用 nodelay,突发请求会立即得到处理。因此,唯一的含义是指定突发 + nodelay 与首先指定 busrt=0 的上限之间没有区别。

因此,更简洁地回答OP问题:指定nodelay时burst的含义与仅指定更大速率而未burst的含义相同。