2013-02-28 16 views
6

Sto cercando di implementare alcune limitazioni sulla nostra API REST. Un typical approach si trova dopo una determinata soglia per bloccare la richiesta (con la risposta 403 o 429). Tuttavia, ho visto one api che aggiunge un ritardo alla risposta.limitazione delle chiamate http api con ritardo

Mentre effettui le chiamate all'API, guarderemo le tue chiamate medie al secondo (c/s) nel corso dei precedenti cinque minuti. Ecco cosa succederà:

  • oltre 3c/s e aggiungiamo un ritardo di 2 secondi

  • oltre 5c/s ed aggiungiamo a 4 secondi di ritardo

  • oltre 7c/s e noi aggiungere un ritardo di 5 secondi

Dal punto di vista del cliente, vedo questo essere meglio di tornare un errore. Il peggio che può succedere è che rallenterai.

Mi chiedo come sia possibile ottenere questo risultato senza influire negativamente sul server dell'applicazione. Ad esempio, per aggiungere tali ritardi, il server deve mantenere aperta la richiesta, causando un numero sempre maggiore di processori di richieste in arrivo.

Qual è il modo migliore per farlo? (cioè è qualcosa che può essere fatto sul server web/bilanciamento del carico in modo che il server dell'applicazione non sia influenzato negativamente? C'è un tipo di livello di limitazione che può essere aggiunto per questo scopo?)

We ' usando Django/Tastypie, ma la domanda è più a livello di architettura/concettuale.

risposta

3

Se si utilizza il server di applicazioni sincrone, che è l'impostazione più comune per le applicazioni Django (ad esempio un gunicorn con --worker-class sync predefinito), l'aggiunta di un tale ritardo nell'applicazione avrebbe effettivamente un impatto molto negativo sulle prestazioni. Un lavoratore che gestisce una richiesta in ritardo sarebbe bloccato durante un periodo di ritardo.

Ma è possibile utilizzare il server di applicazioni asincrone (ad esempio gunicorn con "--worker-class gevent") e quindi un sovraccarico dovrebbe essere trascurabile. Un lavoratore che gestisce una richiesta in ritardo è in grado di gestire altre richieste mentre è in corso un ritardo.

Fare questo nel server proxy inverso può essere un'opzione migliore, perché consente di regolare facilmente e in modo flessibile una politica. C'è an external nginx module for exactly such thing.

+0

Grazie! Sembra esattamente la cosa che stavo cercando (non sono sicuro di quale, ma probabilmente lo farebbe). – gingerlime

+0

Questo 'nginx-delay-module' è in grado di ricevere istruzioni da Django in qualche modo? Ad esempio, se l'abuso viene identificato tramite viste Django, posso chiedere a quel plugin di ritardare la risposta da parte di nginx? Idealmente mi piacerebbe scrivere una classe Throttle personalizzata per DRF usando questo. – dtgq

Problemi correlati