Nginx - qual é o significado de definir 'burst' se houver a opção 'nodelay'

12

Na configuração do Nginx, quando você deseja limitar a taxa de processamento de solicitações usando limit_req_zone / limit_req instructions , não entendo o uso da opção nodelay .
No meu entendimento, ele encerra as solicitações acima da taxa definida sem atrasá-las. Então, parece equivalente a burst=0 . É por isso que não entendo o seguinte exemplo:

limit_req zone=one burst=5 nodelay;

burst define o número de solicitações que podem ser atrasadas. Qual é o significado de definir burst se houver a opção nodelay ?

    
por Nicolas 21.09.2014 / 16:49

5 respostas

25

Acho limit_req documentação suficientemente clara.

burst está documentado dessa forma:

Excessive requests are delayed until their number exceeds the maximum burst size [...]

nodelay está documentado dessa forma:

If delaying of excessive requests while requests are being limited is not desired, the parameter nodelay should be used

As solicitações são limitadas para se ajustarem à taxa definida. Se as solicitações forem recebidas em uma taxa mais alta, não será atendido mais do que o número definido de solicitações por unidade de tempo . Você então precisa decidir o que fazer com essas outras solicitações.

  • Por padrão (não burst , no nodelay ), as solicitações são negadas com um erro HTTP 503.
  • Com burst , você empilha o número definido de solicitações em uma fila de espera, , mas não as processa mais rápido que a taxa de solicitações por unidade de tempo .
  • Com burst e nodelay , a fila não estará esperando e as solicitações serão processadas imediatamente .
por 07.11.2014 / 19:18
8

Os comentários sobre a resposta original parecem errados.

A questão em questão é qual a diferença entre, digamos taxa = 6r / s burst = 0 e taxa = 1r / s burst = 5 nodelay

As respostas são ótimas para explicar a diferença quando a opção nodelay NÃO está presente - nesse caso, as solicitações fazem fila com o burst e são 503 sem o burst.

A resposta original parece certa - com o nodelay, os pedidos de burst são processados imediatamente. E, portanto, a única implicação disso é que NÃO há diferença entre especificar um burst + nodelay vs. apenas especificar um limite maior com busrt = 0 em primeiro lugar.

Portanto, para responder de forma mais sucinta à questão do OP: o significado de burst quando nodelay é especificado é o mesmo que apenas especificar uma taxa maior sem burst.

    
por 31.07.2015 / 06:04
3

Com burst e nodelay especificado, é mais fácil entender o mecanismo como este (o inverso do que é normalmente entendido):

  1. Você permite no máximo% de solicitações burst . Com $binary_remote_addr , esse é o número máximo de solicitações aceitas em um determinado endereço. Cada pedido aumenta um contador interno. Quando o contador atingir burst , todas as solicitações adicionais serão negadas (e o contador não será aumentado além do valor burst ).
  2. Esse contador é diminuído continuamente a uma taxa especificada usando rate .

Esta lógica sugere que faz todo o sentido especificar um valor alto de burst (por exemplo, 100 e mais) e um valor baixo em rate (mesmo algo como 2r / s). Isso lida com a navegação normal (um lote de solicitações paralelas seguidas por um período silencioso) melhor, enquanto protege contra o fluxo de solicitação de bots sustentados.

    
por 16.04.2017 / 23:06
0

Baseado em a excelente resposta de Dan e em o código-fonte do nginx , um resumo conciso do comportamento nodelay parece ser o seguinte:

  • burst é quantas solicitações simultâneas novas são permitidas.
  • rate é quantos novos pedidos concorrentes se tornam antigos por unidade de tempo. (Essa atualização acontece gradualmente: uma vez por solicitação, mas não por segundo).
por 04.05.2018 / 15:12
-2

Estou sugerindo ler este tópico: limite limit_req_zone por localização / proxy

e esta resposta: stackoverflow

    
por 04.05.2016 / 12:58

Tags