使用 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