Com o módulo nginx HttpLimitReq , as solicitações podem ser limitadas por IP. No entanto, não estou entendendo o que a opção "nodelay" faz.
Se as solicitações excedentes dentro do atraso de burst limite não forem necessárias, você deve usar o nodelay
limit_req zone=one burst=5 nodelay;
fonte
TL; DR: a opção nodelay é útil se você deseja impor um limite de taxa sem restringir o espaçamento permitido entre solicitações.
Foi difícil digerir as outras respostas e descobri nova documentação do Nginx com exemplos que respondem a isso: https://www.nginx.com/blog/rate-limiting-nginx/
Aqui está a parte pertinente. Dado:
Se você adicionar nodelay:
fonte
A maneira como eu vejo é a seguinte:
As solicitações serão atendidas o mais rápido possível até que a taxa da zona seja excedida. A taxa de zona é "em média", por isso, se a sua taxa é
1r/s
e explodiu10
você pode ter 10 pedidos em 10 segunda janela.Após a taxa da zona ser excedida:
uma. Sem
nodelay
, mais solicitaçõesburst
serão atrasadas.b. Com
nodelay
, mais solicitaçõesburst
serão atendidas o mais rápido possível.Depois de
burst
excedido, o servidor retornará uma resposta de erro até que a janela de intermitência expire. por exemplo, para taxa1r/s
e burst10
, o cliente precisará esperar até 10 segundos para a próxima solicitação aceita.fonte
A configuração define se as solicitações serão atrasadas para que estejam em conformidade com a taxa desejada ou se serão simplesmente rejeitadas ... um pouco, se a limitação da taxa for gerenciada pelo servidor ou se a responsabilidade for passada ao cliente.
nodelay
presenteOs pedidos serão tratados o mais rápido possível; quaisquer pedidos enviados acima do limite especificado serão rejeitados com o código definido como
limit_req_status
nodelay
ausente (aka atrasado)As solicitações serão tratadas a uma taxa que esteja em conformidade com o limite especificado. Assim, por exemplo, se uma taxa é definida como 10 req / s, cada solicitação será tratada em> = 0,1 (1 / taxa) segundos, não permitindo que a taxa seja excedida, mas permitindo que as solicitações sejam copiadas. Se houver solicitações de backup suficientes para estourar o bucket (o que também seria impedido por um limite de conexão simultâneo), elas serão rejeitadas com o código definido como
limit_req_status
.Os detalhes sangrentos estão aqui: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L263 em que essa lógica entra em ação quando o limite ainda não foi ultrapassado e agora o atraso opcionalmente será aplicado à solicitação. A aplicação
nodelay
específica da diretiva entra em jogo aqui: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L495, fazendo com que o valordelay
acima seja 0, provocando esse manipulador para retornar imediatamente oNGX_DECLINED
que passa a solicitação para o próximo manipulador (e não oNGX_AGAIN
que efetivamente o enfileirará novamente para ser processado novamente).fonte
Não entendi isso na primeira vez em que estava lendo a introdução em https://www.nginx.com/blog/rate-limiting-nginx/ .
Agora tenho certeza de que entendo e minha resposta é até agora a melhor. :)
Suponha:
10r/s
está definido, a capacidade máxima do servidor é, por exemplo,10000r/s
qual é10r/ms
e existe apenas 1 cliente no momento.Então, aqui está a principal diferença entre
10r/s per IP burst=40 nodelay
e10r/s per IP burst=40
.Como o https://www.nginx.com/blog/rate-limiting-nginx/ documentou ( eu recomendo a leitura do artigo primeiro (exceto a seção Limitação de taxa em dois estágios )), esse comportamento corrige um problema. Qual?:
Verifique o rascunho que fiz, a
40th
solicitação obtém resposta às1s
enquanto a outra40th
obtém resposta às4s
.Isso pode fazer o melhor uso possível da capacidade do servidor: envia respostas o mais rápido possível, mantendo a
x r/s
restrição a um determinado cliente / IP.Mas também há custo aqui. O custo será:
Se você tem muitos clientes na fila do servidor, digamos cliente
A
,B
eC
.Sem
nodelay
, os pedidos são atendidos em uma ordem semelhante aABCABCABC
.Com
nodelay
, é mais provável que o pedido sejaAAABBBCCC
.Gostaria de resumir o artigo https://www.nginx.com/blog/rate-limiting-nginx/ aqui.
Acima de tudo, a configuração mais importante é
x r/s
.x r/s
somente solicitações em excesso são rejeitadas imediatamente.x r/s
+burst
, pedidos em excesso estão na fila.1.
vs2.
, o custo é que, no lado do cliente, as solicitações na fila aproveitam as chances de solicitações posteriores que terão a chance de serem atendidas.Por exemplo,
10r/s burst=20
vs10r/s
, a11th
solicitação deve ser rejeitada imediatamente sob a última condição, mas agora está na fila e será atendida. A11th
solicitação aproveita a21th
chance da solicitação.x r/s
+burst
+nodelay
, já explicado.PS A seção Limitação da taxa em dois estágios do artigo é muito confusa. Eu não entendo, mas isso não parece importar.
Por exemplo:
8 r / s? seriamente? Há 17 pedidos dentro de 3 segundos mostrados na imagem, 17/3 = 8?
fonte