Con el módulo nginx HttpLimitReq , las solicitudes pueden estar limitadas por IP. Sin embargo, no entiendo lo que hace la opción "nodelay".
Si el exceso de solicitudes dentro del límite de ráfaga de retardo no es necesario, debe usar el nodolay
limit_req zone=one burst=5 nodelay;
fuente
TL; DR: la opción nodelay es útil si desea imponer un límite de velocidad sin restringir el espacio permitido entre las solicitudes.
Tuve dificultades para digerir las otras respuestas, y luego descubrí nueva documentación de Nginx con ejemplos que responden a esto: https://www.nginx.com/blog/rate-limiting-nginx/
Aquí está la parte pertinente. Dado:
Si agrega nodelay:
fuente
La forma en que lo veo es la siguiente:
Las solicitudes serán atendidas lo más rápido posible hasta que se exceda la tasa de zona. La tasa de zona es "en promedio", por lo que si su tasa es
1r/s
y estalló10
, puede tener 10 solicitudes en una ventana de 10 segundos.Después de que se exceda la tasa de zona:
a. Sin
nodelay
,burst
se retrasarán más solicitudes hasta .si. Con
nodelay
, más solicitudes hastaburst
serán atendidas lo más rápido posible.Una vez
burst
excedido, el servidor devolverá la respuesta de error hasta que caduque la ventana de ráfaga. por ejemplo, para velocidad1r/s
y ráfaga10
, el cliente deberá esperar hasta 10 segundos para la próxima solicitud aceptada.fuente
La configuración define si las solicitudes se retrasarán para que se ajusten a la velocidad deseada o si simplemente serán rechazadas ... de alguna manera si el servidor gestiona la limitación de la velocidad o si la responsabilidad se transfiere al cliente.
nodelay
presenteLas solicitudes serán atendidas lo más rápido posible; cualquier solicitud enviada por encima del límite especificado será rechazada con el código establecido como
limit_req_status
nodelay
ausente (también conocido como retrasado)Las solicitudes se manejarán a una velocidad que se ajuste al límite especificado. Entonces, por ejemplo, si se establece una tasa de 10 req / s, cada solicitud se manejará en> = .1 (1 / tasa) segundos, lo que no permite que se exceda la tasa, pero permite que las solicitudes sean respaldadas. Si se vuelven a realizar suficientes solicitudes para desbordar el depósito (que también se evitaría con un límite de conexión concurrente), se rechazarán con el código establecido como
limit_req_status
.Los detalles sangrientos están aquí: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L263 donde esa lógica se activa cuando el límite aún no se ha pasado y ahora el retraso opcionalmente se aplicará a la solicitud. La aplicación de,
nodelay
en particular, de la directiva entra en juego aquí: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L495 provocando que el valor dedelay
arriba sea 0 provocando que controlador para devolver inmediatamente loNGX_DECLINED
que pasa la solicitud al siguiente controlador (en lugar deNGX_AGAIN
lo que efectivamente solicitará que se procese nuevamente).fuente
No lo entendí la primera vez cuando estaba leyendo la introducción de https://www.nginx.com/blog/rate-limiting-nginx/ .
Ahora estoy seguro de entender y mi respuesta es hasta ahora la mejor. :)
Supongamos:
10r/s
está configurado, la capacidad máxima del servidor es, por ejemplo,10000r/s
cuál es10r/ms
y solo hay 1 cliente en este momento.Así que aquí está la principal diferencia entre
10r/s per IP burst=40 nodelay
y10r/s per IP burst=40
.Como se documenta en https://www.nginx.com/blog/rate-limiting-nginx/ ( recomiendo leer primero el artículo (excepto la sección de limitación de velocidad en dos etapas )), este comportamiento soluciona un problema. ¿Cúal?:
Verifique el borrador que hice, la
40th
solicitud obtiene respuesta en1s
mientras que el otro40th
obtiene respuesta en4s
.Esto puede hacer el mejor uso de la capacidad del servidor: envía las respuestas lo más rápido posible mientras mantiene la
x r/s
restricción a un cliente / IP determinado.Pero también hay un costo aquí. El costo será:
Si tiene muchos clientes haciendo cola en el servidor, digamos cliente
A
,B
yC
.Sin
nodelay
, las solicitudes se atienden en un orden similar aABCABCABC
.Con
nodelay
, el orden es más probable que seaAAABBBCCC
.Me gustaría resumir el artículo https://www.nginx.com/blog/rate-limiting-nginx/ aquí.
Sobre todo, la configuración más importante es
x r/s
.x r/s
solo, las solicitudes en exceso se rechazan de inmediato.x r/s
+burst
, las solicitudes en exceso se ponen en cola.1.
vs2.
, el costo es que en el lado del cliente, las solicitudes en cola aprovechan las posibilidades de solicitudes posteriores que habrán tenido la oportunidad de ser atendidas.Por ejemplo,
10r/s burst=20
vs10r/s
,11th
se supone que la solicitud debe ser rechazada inmediatamente bajo la última condición, pero ahora está en cola y será atendida. La11th
solicitud aprovecha la21th
oportunidad de la solicitud.x r/s
+burst
+nodelay
, ya explicado.PD La sección de limitación de velocidad en dos etapas del artículo es muy confusa. No entiendo, pero eso no parece importar.
Por ejemplo:
8 r / s? ¿seriamente? Hay 17 solicitudes en 3 segundos que se muestran en la imagen, 17/3 = 8?
fuente