我正在转向使用它来替代 NGINX 的 HA,并且我有一个问题,关于如何在 HA 中进行速率限制,以便对请求进行排队而不是关闭它们。
我可以按照以下示例限制每个 IP:https://www.haproxy.com/blog/four-examples-of-haproxy-rate-limiting/。然而,当达到限制时,用户会看到错误并且连接会被关闭。
由于我来自 NGINX,它有这个方便的功能https://www.nginx.com/blog/rate-limiting-nginx/超过阈值的连接可以关闭,但一般会排队。因此,用户仍可以进行呼叫,但会延迟,不会出现错误,并将请求总数保持在阈值之内。
HA 中是否有类似的东西?它应该通过 IP 限制/排队用户。
举个例子来解释一下,我们有两个用户Alice
,分别是ipA.A.A.A
和Bob
ip,B.B.B.B
阈值是30r/minute
。
因此,1分钟内:
- Alice 发出了 20 个请求。-> 没问题
- Bob 提出了 60 个请求。-> 系统将请求数限制为 30 个,然后稍后处理其他 30 个(可能还会添加超时/延迟)
- Alice 发出 50 个请求 -> 前 40 个可以,接下来的 10 个需要排队。
- Bob 发出了 20 个请求 -> 它们排在上面那个请求之后。
这可能吗?
答案1
我找到的解决方案相当复杂,并且包含一个 lua 脚本。但它有效!
我在这里创建了一个要点来简化共享。它有一个 docker-compose 来创建环境和所需的配置。https://gist.github.com/esseti/1382f7df039f9098b425f2a7a338a749
然后,使用AB
你运行ab -n 500 -A A:B http://localhost:8888/
注意:这是我之前写的,后来被其他人修改了。它应该可以工作,但可能需要针对您的具体情况进行改进。尤其是 HA 配置。