Wie kann ich die Bandbreite in Java begrenzen?

8

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.

    
Koerr 16.10.2010, 04:00
quelle

4 Antworten

13

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:

%Vor%

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.

Stephen C 16.10.2010, 04:15
quelle
12

Theorie:

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.

Implementierungen:

RateLimiter von Google Guava

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%

TimedSemaphore von Apache Commons Lang v3

Apache Commons Lang v3 enthält ein TimedSemaphore Klasse, mit der ein Ratenlimit implementiert werden kann.

    
Franck 07.06.2011 21:38
quelle
1

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.

    
PbxMan 29.10.2014 12:04
quelle
0

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.

    
Jilles van Gurp 17.05.2013 13:10
quelle

Tags und Links