Ograniczanie liczby requestów na sekundę do API usługi X

0

Cześć,
wyobraźmy sobie, że mamy usługę X, do którego nasz serwis robi zapytania. Ponieważ nasz serwis przyjmuje duży ruch a usługa X ma limity requestów (http) na sekundę chcemy jakoś "dławić" liczbę zapytań na sekundę. Nasz serwis działa w kilku replikach i limit jest wspólny dla wszystkich replik. Cięzko z góry założyć ile jest replik bo się autoskalują (ale ostatecznie możemy wskazać taką liczbę jeżeli ma to znacznie ułatwić). Nasz serwis jest napisany w Python. I teraz:

  1. Na upartego wiem jak to zrobić
    Pytanie brzmi: jak się takie rzeczy robi prawidłowo?
1

Stawiasz własne proxy przez które twoje nody się komunikują. Więc nikt nie uderza bezpośrednio "sam" do tego zewnętrznego serwisu tylko poprzez to proxy, które zajmuje się utrzymywaniem limitów.
Sama realizacja tego to limitowania może być różna - jakiś wspólny rate counter albo np. requesty lecą na kolejkę i limitujesz ile można z niej odczytać w jednostce czasu.

0

A proxy jest moim własnym serwisem czy jest jakiś gotowiec?

0

Mógłbyś spróbować postawic jakieś standardowe reverse proxy i limitować liczbę połączeń na nich jako N/K (N twój limit requestów a K liczba tych proxy), ale nie wiem czy się to bardzo dobrze sprawdzi. W innym wypadku musisz to zaimplementować samemu, ale taki serwis będzie miał raptem kilka linijek bo niewiele robi.

0

Nginx powinien mieć opcje limitowania ruchu.

1
deweloper_x napisał(a):

A proxy jest moim własnym serwisem czy jest jakiś gotowiec?

Standardowy gotowiec zadziała poprawnie, jeśli usługa jest dobrze skonstruowana z punktu widzenia http oraz większość requestów jest mało interaktywna.
Obie rzeczy są mało prawdopodobne.

Najprawdopodobniej trzeba zainwestować wiedzę na temat samej usługi i w ten sposób decydować jakie odpowiedzi mogą być trzymane w cache a jakie trzeba odświeżać cyklicznie.

0

Myślę, że jedynie mądre cache'owanie ( o ile możliwe ).
Co to za rodzaj usługi ?
Celowe spowalnianie lub limitowanie ruchu to kolejny problem na problemie / kolejkowanie / lawina itp ...
Chyba, że faktycznie kazać czekać użytkownikom aż przyjdzie ich kolej przy czym w szczycie ruchu to będzie równoważne z tym, że niektórzy odpowiedzi się nie doczekają (w rozsądnym czasie)

0

A i jeszcze jedno, standardowy serwer proxy wcale nie musi ograniczyć liczby requestów nawet jeśli usługa jest 100% poprawnie zbudowana i mało interaktywna.

Np:
Request idzie do proxy, proxy widzi, że ma już odpowiedź z jakimś ETag.
Proxy zamiast odpowiedzieć, najpierw musi sprawdzić, czy dane się nie zmieniły. Więc przekazuje request z posiadanym ETag do serwera.
Serwer widzi że ETag pasuje i nic się nie zmieniło, więc odpowiada 304 Not Modified.
Wówczas proxy przekazuje pełną zapamiętaną odpowiedź do klienta.

Czyli liczba requestów do serwera się nie zmienia, ale nie jest konieczny transfer zasobów pomiędzy server-proxy.

https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html

1
deweloper_x napisał(a):

Pytanie brzmi: jak się takie rzeczy robi prawidłowo?

Zwiększa się limity dla usługi X.

Właściwie jeszcze nikt nie zapytał czy:

  1. Czy ta Usługa X jest Wasza czy nie ?
  2. Czy jest możliwość zwiększenia limitu zapytań?
  3. Z czego wynika limit zapytań na sek.?
0

Po odpowiedziach autora dochodzę do wniosku, że nie tylko jest za mało detali (więcej niż wytyka katakrowa), ale również podejrzewam, że pytanie cierpi na problem XY.

1 użytkowników online, w tym zalogowanych: 0, gości: 1