Sorry send to early. Now the full answer.

On 08.06.20 14:39, Aleksandar Lazic wrote:
> On 08.06.20 14:28, Stefano Tranquillini wrote:
>> Hi thanks for the reply
>>
>> why the set-priority is a better choice? 
>> will it just limit the connection in case there's need while it 
>> will not limit the connection per se?
>> i mean, if the system is capable of supporting 600 calls, with 
>> the set priority it will still process the 600 calls rather than 
>> limit the user to a max of 100 per minute

Well, as far as I know have hapoxy not the feature to "delay" a
connection except to move it in the request queue.
My idea is to move the requests to different queue which will be
handled after the other requests are handled.

I don't know if this will work, it's just a idea.

Regards
Aleks

> 
>> On Mon, Jun 8, 2020 at 1:27 PM Aleksandar Lazic <[email protected] 
>> <mailto:[email protected]>> wrote:
>>
>>     On 08.06.20 09:15, Stefano Tranquillini wrote:
>>     >
>>     >
>>     > On Sun, Jun 7, 2020 at 11:11 PM Илья Шипицин <[email protected] 
>> <mailto:[email protected]> <mailto:[email protected] 
>> <mailto:[email protected]>>> wrote:
>>     >
>>     >
>>     >
>>     >     вс, 7 июн. 2020 г. в 19:59, Stefano Tranquillini <[email protected] 
>> <mailto:[email protected]> <mailto:[email protected] 
>> <mailto:[email protected]>>>:
>>     >
>>     >         Hello all,
>>     >
>>     >         I'm moving to HA using it to replace NGINX and I've a question 
>> regarding how to do a Rate Limiting in HA that enables queuing the requests 
>> instead of closing them.
>>     >
>>     >         I was able to limit per IP following those examples: 
>> https://www.haproxy.com/blog/four-examples-of-haproxy-rate-limiting/ . 
>> However, when the limit is reached, the users see the error and connection 
>> is closed.
>>     >
>>     >         Since I come from NGINX, it has this handy feature 
>> https://www.nginx.com/blog/rate-limiting-nginx/ where connections that 
>> exceed the threshold are queued. Thus the user will still be able to do the 
>> calls but be delayed without him getting errors and keep the overall number 
>> of requests within threshold.
>>     >
>>     >         Is there anything similar in HA? It should limit/queueing the 
>> user by IP.
>>     >
>>     >         To explain with an example, we have two users |Alice|, with ip 
>> |A.A.A.A| and |Bob| with ip |B.B.B.B| The threshold is |30r/minute|.
>>     >
>>     >         So in 1 minute:
>>     >
>>     >           * Alice does 20 requests. -> that's fine
>>     >           * Bob does 60 requests. -> the system caps the requset to 30 
>> and then process the other 30 later on (maybe also adding timeout/delay)
>>     >           * Alice does 50 request -> the first 40 are fine, the next 
>> 10 are queued.
>>     >           * Bob does 20 requests -> they are queue after the one above.
>>     >
>>     >         I saw that it can be done in general, by limiting the 
>> connections per host. But this will mean that it's cross IP and thus, if 500 
>> is the limit
>>     >         - Alice  does 1 call
>>     >         - Bob does 1000 calls
>>     >         - Alice does another 1 call
>>     >         - Alice will be queued, that's not what i would like to have.
>>     >
>>     >         is this possible? Is there anything similar that can be done?
>>     >
>>     >
>>     >     it is not cross IP.  I wish nginx docs would be better on that.
>>     >
>>     > What do you mean?
>>     > in nginx i do
>>     > limit_req_zone $binary_remote_addr zone=prod:10m rate=40r/m;
>>     > and works
>>     >
>>     >     first, in nginx terms it is limited by zone key. you can define 
>> key using for example $binary_remote_addr$http_user_agent$ssl_client_ciphers
>>     >     that means each unique combination of those parameters will be 
>> limited by its own counter (or you can use nginx maps to construct such a 
>> zone key)
>>     >
>>     >     in haproxy you can see and example of
>>     >
>>     >     # Track client by base32+src (Host header + URL path + src IP)
>>     >
>>     >     http-requesttrack-sc0 base32+src
>>     >
>>     >     which also means key definition may be as flexible as you can 
>> imagine.
>>     >
>>     >
>>     > the point is, how can i cap the number of requests for a single user 
>> to 40r/minute for example? or any number.
>>     >
>>     > What I was able to do is to slow it down in this way, but it does not 
>> ensure the cap per request, it only adds 500ms to each call.
>>     >
>>     > frontend proxy
>>     >     bind *:80
>>     >     # ACL function declarations
>>     >     acl is_first_level src_http_req_rate(Abuse) ge 30 
>>     >     use_backend api_delay if is_first_level
>>     >     use_backend api
>>     >
>>     > backend api
>>     >     server api01 api01:80  
>>     >     server api02 api02:80
>>     >     server api03 api03:80
>>     >
>>     > backend api_delay
>>     >     tcp-request inspect-delay 500ms
>>     >     tcp-request content accept if WAIT_END
>>     >     server api01 api01:80  
>>     >     server api02 api02:80
>>     >     server api03 api03:80
>>     >
>>     > backend Abuse
>>     >     stick-table type ip size 100k expire 15s store http_req_rate(10s)
>>
>>     I would try to use "http-request set-priority-class" and/or
>>     "http-request set-priority-offset" for this.
>>     
>> http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#4.2-http-request%20set-priority-class
>>     
>> http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#4.2-http-request%20set-priority-offset
>>
>>     ```
>>     acl is_first_level src_http_req_rate(Abuse) ge 30
>>     http-request set-priority int(20) if is_first_level
>>
>>     ```
>>
>>     In the mailing list archive is a example how to use it
>>     https://www.mail-archive.com/[email protected]/msg29915.html
>>
>>     Sorry that I can't give you a better solution but I never used it
>>     so it would be nice to get feedback if this options works for your
>>     use case
>>
>>     >
>>     >         Thanks
>>     >         --
>>     >         *Stefano*
>>     > --
>>     > Stefano
>>
>>     Regards
>>     Aleks
>>
>>
>>
>> -- 
>> *Stefano Tranquillini, *CTO/Co-Founder @ chino.io <http://chino.io/> 
>> /Need to talk? book a slot <http://bit.ly/2LdXbZQ>/
>> /Please consider the environment before printing this email - //keep it 
>> short <http://five.sentenc.es/> /
>>
>>
> 
> 


Reply via email to