Hi,

On Wed, Jan 23, Thomas Hilaire wrote:
> Hi,
> 
> I want to implement a rate-limit system using the sticky table of
> HAProxy. Consider that I have 100 servers, and a limit of 10
> requests per server, the ACL would be:
> 
>     http-request track-sc0 int(1) table GlobalRequestsTracker
>     http-request deny deny_status 429 if {
> sc0_http_req_rate(GlobalRequestsTracker),div(100) gt 10 }
> 
> Now if I want to make this dynamic depending on the healthy servers
> count, I need to replace the hardcoded `100` per the `nbsrv`
> converter like this:
> 
>     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
> }
> 
> But I'm getting the error:
> 
>     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))'.
> 
> Is there a way to use `nbsrv` as a variable inside the `div` operator?

Untested: does something like this work:

http-request set-var(req.dummy) nbsrv(GlobalRequestsTracker)
http-request deny deny_status 429 if { 
sc0_http_req_rate(GlobalRequestsTracker),div(req.dummy) gt 10 }

-Jarno

-- 
Jarno Huuskonen

Reply via email to