Ich habe jede Stunde einen Java-Scheduler geschrieben mit:
%Vor%oder
%Vor%um eine große XML / HTML-Datei zu erhalten.
Die maximale Bandbreite meines Servers ist 2 MBit.
Wenn dieser Java-Zeitplancode ausgeführt wird, verwende ich über 2 MB Bandbreite. ( schau es dir an )
Jedes Mal, wenn ein Benutzer meinen Server besucht, ist es zu langsam.
Wie beschränke ich meinen Java-Zeitplan auf eine geringere Bandbreite? (zB 500Kbits)
Ich benutze den Ubuntu-Server.
Es gibt keine elegante Möglichkeit, dies zu tun.
Eine einfache, aber unelegante Methode wäre das Schreiben eines Java-Stream-Wrappers, der die Rate begrenzt, mit der Bytes aus dem umschlossenen Stream gelesen werden. Wenn Sie z. B. auf 1000 Byte pro Sekunde beschränken möchten, kann die Methode int read()
wie folgt implementiert werden:
Es ist erwähnenswert, dass Drosselraten wie diese sowohl negative als auch positive Auswirkungen haben können. Auf der negativen Seite:
Es bindet Ressourcen auf der Serverseite länger. In diesem Fall handelt es sich um den Java-Thread, der den Download behandelt, und Speicher im Kernel-Bereich wird verwendet, um empfangene Netzwerkpakete zu puffern, bis die Anwendung sie liest.
Es kann auch zu mehr Netzwerkverkehr führen. Das Problem ist, dass diese Art der Drosselung den reibungslosen Ablauf der Pakete stören wird. Der Server puffert nur eine relativ kleine Anzahl von Paketen, und wenn diese Anzahl überschritten wird, muss er den Client vorerst STOPPEN. Dies erfordert zusätzliche Signalisierungspakete (ACKs) und es werden wahrscheinlich Datenpakete fallengelassen. Eventuell müssen diese Datenpakete erneut übertragen werden.
Token Bucket Algorithm ist eine Möglichkeit, die Bandbreite eines Downloads zu begrenzen. Sie sollten diesen Artikel lesen: Es erklärt die Verwendung dieses Algorithmus.
Google Guava 22.0 enthält einen RateLimiter Klasse, aber es ist immer noch in der Beta.
Von api Dokumentation:
Stellen Sie sich zum Beispiel vor, dass wir eine Liste von Aufgaben haben, die ausgeführt werden sollen, aber wir wollen nicht mehr als 2 pro Sekunde einreichen:
%Vor%Stellen Sie sich als Beispiel vor, dass wir einen Datenstrom erzeugen, den wir mit 5 KB pro Sekunde begrenzen wollen. Dies könnte erreicht werden, indem pro Byte eine Erlaubnis verlangt wird und eine Rate von 5000 Genehmigungen pro Sekunde spezifiziert wird:
%Vor%Apache Commons Lang v3 enthält ein TimedSemaphore Klasse, mit der ein Ratenlimit implementiert werden kann.
Eine andere Lösung wäre, einen Proxy Server zu verwenden, der die Bandbreite begrenzt. Siehe Themen hier und hier . Aber wenn Sie eine vollständige Java-Lösung möchten, können Sie einen einfachen Socket-Java-Proxy-Server hier verwenden und verlangsamen Sie das Lesen / Schreiben von Streams mit Thread.sleep oder auf andere Weise.
Sieh dir diesen Thread an: Ссылка
Wenn Sie Apache httpclient verwenden, können Sie es auch für die Verwendung der gzip-Komprimierung konfigurieren und ein wenig Bandbreite sparen. Insbesondere bei xml sollten Sie erwarten, dass weniger Bytes auf diese Weise übertragen werden.
Tags und Links java