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.
Danke! Sieht genau nach dem aus, was ich gesucht habe (nicht sicher, was, aber wahrscheinlich auch). – gingerlime
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