2013-02-28 5 views
6

Ich versuche, einige drosseln auf unserem REST API zu implementieren. A typical approach wird nach einer gewissen Schwelle die Anforderung (mit 403 oder 429 response) zu blockieren. Allerdings habe ich one api gesehen, die eine Verzögerung der Antwort fügt statt.Drosselung http api Anrufe mit Verzögerung

Während Sie die API aufrufen, betrachten wir Ihre durchschnittlichen Anrufe pro Sekunde (c/s) in den letzten fünf Minuten. Hier ist, was passieren wird:

  • über 3c/s und wir fügen Sie eine Verzögerung von 2 Sekunden

  • über 5c/s und fügen wir eine 4 Sekunden Verzögerung

  • über 7c/s und wir eine Verzögerung von 5 Sekunden hinzufügen

Aus der Sicht des Kunden, sehe ich das besser ist, als erhalte eine Fehlermeldung zurück. Das Schlimmste, was passieren kann, ist, dass Sie langsamer werden.

Ich frage mich, wie dies erreicht werden kann ohne negative Auswirkungen auf den App-Server. Um diese Verzögerungen hinzuzufügen, muss der Server die Anfrage offen halten, sodass mehr und mehr Anfrageprozessoren beschäftigt sind, was bedeutet, dass weniger Kapazität für neue Anfragen verfügbar ist.

Was ist der beste Weg, dies zu erreichen? (Ist dies etwas, das auf dem Webserver/Load Balancer durchgeführt werden kann, damit der Anwendungsserver nicht negativ beeinflusst wird? Gibt es eine Art Drosselungsschicht, die für diesen Zweck hinzugefügt werden kann?)

Wir ' Verwenden Sie Django/Tastypie, aber die Frage ist mehr auf der Architektur/konzeptionellen Ebene.

Antwort

3

Wenn Sie den synchronen Anwendungsserver verwenden, der das gebräuchlichste Setup für Django-Anwendungen ist (z. B. ein Gunicorn mit Standard --worker-class sync), hätte das Hinzufügen einer solchen Verzögerung in der Anwendung tatsächlich sehr negative Auswirkungen auf die Leistung. Ein Mitarbeiter, der eine verzögerte Anfrage bearbeitet, wird während einer Verspätungsperiode gesperrt.

Aber Sie können asynchrone Anwendungsserver verwenden (zB gunicorn mit ‚--worker-Klasse gevent`) und dann sollte ein Kopf vernachlässigbar sein. Ein Worker, der verzögerte Anforderungen verarbeitet, kann während einer Verzögerung andere Anforderungen verarbeiten.

dies in dem Reverse-Proxy-Server Dadurch kann eine bessere Option sein, weil es anpassen einfach und flexibel eine Politik ermöglicht. Es gibt an external nginx module for exactly such thing.

+0

Danke! Sieht genau nach dem aus, was ich gesucht habe (nicht sicher, was, aber wahrscheinlich auch). – gingerlime

+0

Kann das 'nginx-delay-modul' Anweisungen von Django in irgendeiner Weise übernehmen? Wenn Missbrauch beispielsweise über Django-Aufrufe erkannt wird, kann ich das Plugin anweisen, die Antwort auf der Seite von nginx zu verzögern? Im Idealfall möchte ich eine benutzerdefinierte Throttle-Klasse für DRF schreiben. – dtgq

Verwandte Themen