mirror of
https://github.com/haproxy/haproxy.git
synced 2026-02-18 18:19:39 -05:00
MINOR: acl: add fetch for server session rate
Considering there is no option yet for maxconnrate for servers, I wrote an ACL to check a backend server session rate which we use to send to an "overflow" backend to prevent latency responses to our clients (very sensitive latency requirements).
This commit is contained in:
parent
4445502351
commit
7896d5293d
2 changed files with 29 additions and 0 deletions
|
|
@ -8021,6 +8021,20 @@ be_sess_rate(<backend>) <integer>
|
|||
acl being_scanned be_sess_rate gt 100
|
||||
redirect location /denied.html if being_scanned
|
||||
|
||||
srv_sess_rate(<backend>/<server>) <integer>
|
||||
Returns true when the sessions creation rate on the server matches the
|
||||
specified values or ranges, in number of new sessions per second. This is
|
||||
used to switch to an alternate backend when an expensive or fragile one
|
||||
reaches too high a session rate, or to limit abuse of service (eg. prevent
|
||||
latent requests from overloading servers).
|
||||
|
||||
Example :
|
||||
# Redirect to a separate back
|
||||
acl srv1_full srv_sess_rate(be1/srv1) gt 50
|
||||
acl srv2_full srv_sess_rate(be1/srv2) gt 50
|
||||
use_backend be2 if srv1_full or srv2_full
|
||||
|
||||
|
||||
connslots <integer>
|
||||
connslots(<backend>) <integer>
|
||||
The basic idea here is to be able to measure the number of connection "slots"
|
||||
|
|
|
|||
|
|
@ -1587,6 +1587,20 @@ acl_fetch_srv_conn(struct proxy *px, struct session *l4, void *l7, unsigned int
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* set temp integer to the number of enabled servers on the proxy.
|
||||
* Accepts exactly 1 argument. Argument is a server, other types will lead to
|
||||
* undefined behaviour.
|
||||
*/
|
||||
static int
|
||||
acl_fetch_srv_sess_rate(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
|
||||
const struct arg *args, struct sample *smp)
|
||||
{
|
||||
smp->flags = SMP_F_VOL_TEST;
|
||||
smp->type = SMP_T_UINT;
|
||||
smp->data.uint = read_freq_ctr(&args->data.srv->sess_per_sec);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Note: must not be declared <const> as its list will be overwritten.
|
||||
* Please take care of keeping this list alphabetically sorted.
|
||||
*/
|
||||
|
|
@ -1601,6 +1615,7 @@ static struct acl_kw_list acl_kws = {{ },{
|
|||
{ "srv_conn", acl_parse_int, acl_fetch_srv_conn, acl_match_int, ACL_USE_NOTHING, ARG1(1,SRV) },
|
||||
{ "srv_id", acl_parse_int, acl_fetch_srv_id, acl_match_int, ACL_USE_RTR_INTERNAL, 0 },
|
||||
{ "srv_is_up", acl_parse_nothing, acl_fetch_srv_is_up, acl_match_nothing, ACL_USE_NOTHING, ARG1(1,SRV) },
|
||||
{ "srv_sess_rate", acl_parse_int, acl_fetch_srv_sess_rate, acl_match_int, ACL_USE_NOTHING, ARG1(1,SRV) },
|
||||
{ NULL, NULL, NULL, NULL },
|
||||
}};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue