使用 haproxy 实施与健康服务器计数相关的速率限制
Implement a rate-limit relating to the healthy servers count using haproxy
我想使用 HAProxy 的粘性 table 实现限速系统。考虑到我有 100 台服务器,每台服务器限制 10 个请求,ACL 将是
http-request track-sc0 int(1) table GlobalRequestsTracker
http-request deny deny_status 429 if { sc0_http_req_rate(GlobalRequestsTracker),div(100) gt 10 }
现在,如果我想根据运行状况良好的服务器数量使其动态变化,我需要根据 nbsrv
转换器替换硬编码的 100
。
http-request track-sc0 int(1) table GlobalRequestsTracker
http-request deny deny_status 429 if { sc0_http_req_rate(GlobalRequestsTracker),div(nbsrv(MyBackend)) gt 10 }
但我收到错误消息:
error detected while parsing an 'http-request deny' condition : invalid args in converter 'div' : expects an integer or a variable name in ACL expression 'sc0_http_req_rate(GlobalRequestsTracker),div(nbsrv(MyBackend))'.
有没有办法在 div
运算符中使用 nbsrv
作为变量?
据我所知,HAProxy 不允许嵌套函数调用。但是您可以将后端服务器的数量存储在变量中并在分区中使用它(请参阅 HAProxy 文档中的 http-request set-var
)。我没有测试过或使用过它,但我想它可能看起来像:
frontend <fe>
http-request track-sc0 int(1) table <tbl>
http-request set-var(req.<var>) nbsrv(<be>)
http-request deny deny_status <code> if { sc0_http_req_rate(<tbl>),div(req.<var>) gt <val> }
查看 HAProxy documentation。
我想使用 HAProxy 的粘性 table 实现限速系统。考虑到我有 100 台服务器,每台服务器限制 10 个请求,ACL 将是
http-request track-sc0 int(1) table GlobalRequestsTracker
http-request deny deny_status 429 if { sc0_http_req_rate(GlobalRequestsTracker),div(100) gt 10 }
现在,如果我想根据运行状况良好的服务器数量使其动态变化,我需要根据 nbsrv
转换器替换硬编码的 100
。
http-request track-sc0 int(1) table GlobalRequestsTracker
http-request deny deny_status 429 if { sc0_http_req_rate(GlobalRequestsTracker),div(nbsrv(MyBackend)) gt 10 }
但我收到错误消息:
error detected while parsing an 'http-request deny' condition : invalid args in converter 'div' : expects an integer or a variable name in ACL expression 'sc0_http_req_rate(GlobalRequestsTracker),div(nbsrv(MyBackend))'.
有没有办法在 div
运算符中使用 nbsrv
作为变量?
HAProxy 不允许嵌套函数调用。但是您可以将后端服务器的数量存储在变量中并在分区中使用它(请参阅 HAProxy 文档中的 http-request set-var
)。我没有测试过或使用过它,但我想它可能看起来像:
frontend <fe>
http-request track-sc0 int(1) table <tbl>
http-request set-var(req.<var>) nbsrv(<be>)
http-request deny deny_status <code> if { sc0_http_req_rate(<tbl>),div(req.<var>) gt <val> }
查看 HAProxy documentation。