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/sy 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,burstse retrasarán más solicitudes hasta .si. Con
nodelay, más solicitudes hastaburstserán atendidas lo más rápido posible.Una vez
burstexcedido, el servidor devolverá la respuesta de error hasta que caduque la ventana de ráfaga. por ejemplo, para velocidad1r/sy 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.
nodelaypresenteLas 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_statusnodelayausente (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,
nodelayen 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 dedelayarriba sea 0 provocando que controlador para devolver inmediatamente loNGX_DECLINEDque pasa la solicitud al siguiente controlador (en lugar deNGX_AGAINlo 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/sestá configurado, la capacidad máxima del servidor es, por ejemplo,10000r/scuál es10r/msy solo hay 1 cliente en este momento.Así que aquí está la principal diferencia entre
10r/s per IP burst=40 nodelayy10r/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
40thsolicitud obtiene respuesta en1smientras que el otro40thobtiene 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/srestricció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,ByC.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/ssolo, 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=20vs10r/s,11thse supone que la solicitud debe ser rechazada inmediatamente bajo la última condición, pero ahora está en cola y será atendida. La11thsolicitud aprovecha la21thoportunidad 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