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

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

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

limit_req zone=one burst=5 nodelay;

burst定义了可以延迟的请求数,那么burst如果有nodelay选项,定义有什么意义呢?

答案1

我发现limit_req文档足够清晰。

burst记录方式如下:

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

nodelay记录方式如下:

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

请求数量会受到限制,以符合定义的速率。如果请求以更高的速率传入,则不会超过定义的每单位时间的请求数将被处理。然后您需要决定如何处理其他请求。

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

答案2

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

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

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

答案3

原答案的评论好像是错误的。

当前的问题是,rate=6r/s burst=0 和 rate=1r/s burst=5 nodelay 之间有什么区别

这些答案很好地解释了当不存在 nodelay 选项时的区别——在这种情况下,请求会与突发一起排队,而在没有突发的情况下则会被 503 处理。

最初的答案似乎很正确——使用 nodelay,突发请求会立即得到处理。因此,唯一的暗示是,指定突发 + nodelay 与首先指定 busrt=0 的更高限制之间没有区别。

因此,为了更简洁地回答 OP 的问题:指定 nodelay 时突发的含义与仅指定没有突发的更大速率相同。

答案4

基于丹的回答很棒以及nginx 源代码,该行为的简要总结nodelay如下:

  • burst有多少新的允许并发请求。
  • rate有多少新的并发请求变成老的每单位时间。(此更新逐渐发生:每个请求一次,但不是每秒一次。)

相关内容