
Ich betreibe derzeit einen Webdienst-Endpunkt, an den die Benutzer XML-Dateien senden können. Dieser wird mit über 1.000 Anfragen pro Sekunde stark beansprucht.
Jetzt senden sie diese XML-Dateien per HTTP-Post, aber bei der großen Mehrheit davon wird eine Geschwindigkeitsbeschränkung gelten.
Das Problem besteht darin, dass die Ratenbegrenzung von der Webanwendung durchgeführt wird, indem die Quell-ID in der XML-Datei nachgeschlagen wird. Wenn die Anzahl über x Anfragen pro Minute liegt, wird sie nicht weiter verarbeitet.
Ich habe mich gefragt, ob ich die Ratenbegrenzung irgendwie früher in der Verarbeitung überprüfen könnte, um so zu verhindern, dass die 50 KB-Datei durch die Pipeline zu meinen Webservern wandert und Ressourcen verbraucht.
Könnte ein Lastenausgleich einen Aufruf tätigen, um die Ratennutzung irgendwie zu überprüfen?
Wenn dies möglich ist, könnte ich die Quell-ID möglicherweise in einen Host-Header einfügen, sodass nicht einmal die XML-Datei analysiert und in den Speicher geladen werden muss.
Ist es möglich, nur die Host-Header anzusehen und nicht die gesamte 50-KB-XML-Datei in den Speicher zu laden?
Ich schätze Ihre Einblicke sehr, da dies mehr Kenntnisse über den gesamten TCP/IP-Stack usw. erfordert.
Antwort1
Es gibt zwei grundsätzliche Möglichkeiten:
1) Sie haben es mit feindlichen Angreifern zu tun, die bei Ihrem Entwurf nicht mitmachen. Warum ist es Ihnen in diesem Fall wichtig, welche Host
Header sie senden? Begrenzen Sie die Rate nach IP.
2) Sie haben es mit kooperierenden Kunden zu tun, die Ihnen mehr Arbeit aufbürden, als Sie möchten. In diesem Fall akzeptieren Sie einfach die Anfrage und senden Ihnen eine Antwort, in der Sie sie auffordern, sich zurückzuhalten.
Wenn Sie eine kompliziertere Situation haben, die nicht in eine dieser beiden einfachen Kategorien fällt, hängt die beste Lösung wahrscheinlich von der jeweiligen Situation ab.
Antwort2
Sie können es über Apache mit ähnlichen Modulen blockieren. Oder wenn Sie es früher ausschalten möchten, können Sie die Zeichenfolgenübereinstimmung von iptables verwenden, um Dinge über einen regulären Ausdruck zu blockieren.
Antwort3
Das ist, was dietcBefehl/Dienstprogramm ist dafür da - es erfordert ein wenig Einarbeitung, aber es ist die Mühe wert. Ich verwende es, um die Geschwindigkeit von Übertragungen zu einem Server in einer DMZ außerhalb unseres Firmen-LANs zu begrenzen.
Hier sind ein paar Links, die mir auf den richtigen Weg geholfen haben ...
Tc-Filter - Portbereiche Maskenwert berechnen: http://mailman.ds9a.nl/pipermail/lartc/2007q4/021739.html
Ratenbegrenzung eines einzelnen Hosts oder einer Netzmaske: http://lartc.org/howto/lartc.ratelimit.single.html