Dokumentacja tutaj zawiera wyjaśnienie, które brzmi jak to, co chcesz wiedzieć:
Dyrektywa określa strefę (strefę) i maksymalne możliwe serie żądań (seria). Jeśli szybkość przekracza wymagania określone w strefie, żądanie jest opóźniane, aby zapytania były przetwarzane z określoną prędkością
Z tego, co rozumiem, żądania dotyczące serii będą opóźnione (poświęć więcej czasu i poczekaj, aż zostaną obsłużone), z nodelay
opcjami opóźnienie nie jest używane, a nadmiarowe żądania są odrzucane z błędem 503.
Ten post na blogu ( archive.org ) dobrze wyjaśnia, w jaki sposób działa ograniczenie prędkości na nginx:
Jeśli jesteś podobny do mnie, prawdopodobnie zastanawiasz się, co naprawdę oznacza ten wybuch. Oto sztuczka: zamień słowo „seria” na „wiadro” i załóż, że każdy użytkownik otrzymuje wiadro z 5 tokenami. Za każdym razem, gdy przekroczą stawkę 1 żądania na sekundę, muszą zapłacić token. Po wydaniu wszystkich swoich tokenów pojawia się komunikat o błędzie HTTP 503, który zasadniczo stał się standardem „wycofaj się, stary!”.
TL; DR: Opcja nodelay jest przydatna, jeśli chcesz narzucić limit prędkości bez ograniczania dozwolonych odstępów między żądaniami.
Trudno mi było przetrawić inne odpowiedzi, a następnie odkryłem nową dokumentację od Nginx z przykładami, które odpowiadają na to: https://www.nginx.com/blog/rate-limiting-nginx/
Oto istotna część. Dany:
Jeśli dodasz nodelay:
źródło
Widzę to następująco:
Żądania będą obsługiwane tak szybko, jak to możliwe, aż do przekroczenia stawki strefy. Stawka strefy jest „średnio”, więc jeśli Twoja stawka jest
1r/s
szybka10
, możesz mieć 10 żądań w 10 sekundowym oknie.Po przekroczeniu stawki strefy:
za. Bez tego
nodelay
dalsze zapytaniaburst
będą opóźnione.b. Dzięki
nodelay
, kolejne żądania doburst
będą obsługiwane tak szybko, jak to możliwe.Po
burst
przekroczeniu tego czasu serwer zwróci odpowiedź na błąd do momentu wygaśnięcia okna serii. np. w przypadku stawki1r/s
i serii10
, klient będzie musiał czekać do 10 sekund na następne zaakceptowane żądanie.źródło
To ustawienie określa, czy żądania będą opóźnione, aby były zgodne z żądaną szybkością, czy też zostaną po prostu odrzucone ... w pewnym stopniu, czy ograniczeniem prędkości zarządza serwer, czy odpowiedzialność jest przekazywana klientowi.
nodelay
obecnyŻądania będą rozpatrywane tak szybko, jak to możliwe; wszelkie żądania wysłane powyżej określonego limitu zostaną odrzucone z kodem ustawionym jako
limit_req_status
nodelay
nieobecny (inaczej opóźniony)Żądania będą obsługiwane z szybkością zgodną z określonym limitem. Na przykład, jeśli szybkość zostanie ustawiona na 10 req / s, każde żądanie zostanie obsłużone w ciągu> = .1 (1 / szybkość) sekund, co nie pozwoli na przekroczenie prędkości, ale pozwoli na utworzenie kopii zapasowej żądań. Jeśli wystarczająca liczba żądań z powrotem do przepełnienia segmentu (co byłoby również niemożliwe przez równoczesny limit połączeń), są one odrzucane z kodem ustawionym jako
limit_req_status
.Krwawe szczegóły są tutaj: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L263 gdzie ta logika rozpoczyna się, gdy limit nie został jeszcze przekroczony, a teraz opóźnienie opcjonalnie zostanie zastosowany do żądania. Zastosowanie ma
nodelay
w szczególności zastosowanie dyrektywy: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L495 powodując, żedelay
powyższa wartość wynosi 0, co powoduje, że moduł obsługi do natychmiastowego zwrócenia,NGX_DECLINED
który przekazuje żądanie do następnego modułu obsługi (zamiast tego,NGX_AGAIN
który będzie wymagał ponownego przetworzenia).źródło
Nie zrozumiałem tego po raz pierwszy, kiedy czytałem wprowadzenie z https://www.nginx.com/blog/rate-limiting-nginx/ .
Teraz jestem pewien, że rozumiem, a moja odpowiedź jest jak dotąd najlepsza. :)
Załóżmy, że:
10r/s
jest ustawiony, maksymalna zdolność serwera to np.10000r/s
Który jest10r/ms
i jest w tej chwili tylko 1 klient.Oto główna różnica między
10r/s per IP burst=40 nodelay
i10r/s per IP burst=40
.Jak udokumentowano na https://www.nginx.com/blog/rate-limiting-nginx/ ( zdecydowanie polecam najpierw przeczytać artykuł (z wyjątkiem sekcji Dwustopniowego ograniczania prędkości )), takie zachowanie rozwiązuje jeden problem. Który?:
Sprawdź wersję roboczą, którą wykonałem,
40th
żądanie otrzymuje odpowiedź o,1s
podczas gdy druga40th
otrzymuje odpowiedź o4s
.To może najlepiej wykorzystać możliwości serwera: odsyła odpowiedzi tak szybko, jak to możliwe, jednocześnie zachowując
x r/s
ograniczenie do danego klienta / adresu IP.Ale tutaj też są koszty. Koszt będzie wynosić:
Jeśli masz wielu klientów w kolejce na serwerze, powiedzmy klient
A
,B
iC
.Bez
nodelay
żądania są obsługiwane w kolejności podobnej doABCABCABC
.W
nodelay
przypadku zamówienia jest bardziej prawdopodobneAAABBBCCC
.Chciałbym podsumować artykuł https://www.nginx.com/blog/rate-limiting-nginx/ tutaj.
Przede wszystkim najważniejsza jest konfiguracja
x r/s
.x r/s
tylko nadmierne wnioski są natychmiast odrzucane.x r/s
+burst
, nadmiarowe żądania są w kolejce.1.
vs2.
, koszt jest taki, że po stronie klienta kolejki żądań podejmują ryzyko późniejszych żądań, które miały szansę zostać obsłużone.Na przykład
10r/s burst=20
vs10r/s
The11th
prośba ma być natychmiast odrzucona na podstawie tego ostatniego warunku, ale teraz jest w kolejce i będzie służył.11th
Żądanie zajmuje21th
szansę życzenie użytkownika.x r/s
+burst
+nodelay
, już wyjaśnione.PS Rozdział dwustopniowego ograniczenia prędkości w artykule jest bardzo mylący. Nie rozumiem, ale to nie wydaje się mieć znaczenia.
Na przykład:
8 r / s? poważnie? Obraz pokazuje 17 żądań w ciągu 3 sekund, 17/3 = 8?
źródło