Реализуйте ограничение скорости, относящееся к исправному количеству серверов, используя haproxy - PullRequest
0 голосов
/ 17 января 2019

Я хочу реализовать систему ограничения скорости, используя липкую таблицу HAProxy. Учтите, что у меня 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 }

Теперь, если я хочу сделать это динамическим в зависимости от количества исправных серверов, мне нужно заменить жестко закодированный 100 на nbsrv конвертер.

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))'.

Есть ли способ использовать nbsrv в качестве переменной внутри оператора div?

1 Ответ

0 голосов
/ 23 января 2019
Насколько мне известно,

HAProxy не допускает вызовы вложенных функций. Но вы можете хранить число внутренних серверов в переменной и использовать ее в подразделении (см. http-request set-var в документации HAProxy ). Я не проверял это или использовал лично, но я думаю, что это могло бы выглядеть как:

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 документация .

...