2017-06-23 1 views
1

Jetty HttpClient startet Threads beim Start und scheint eine beträchtliche Anzahl von ihnen zu generieren. Ich war ein wenig überrascht, da ich dachte, eine der Tugenden von -basierten Netzwerken war das Multiplexen von Konversationen über Threads. Es wäre einfach, die Kontrolle über die Anzahl der Threads mit HttpClient.setExecutor(...) zu übernehmen, aber ich bin mir nicht sicher, wie ich darüber nachdenken soll, wie viele Threads benötigt werden. Benötigt die Bibliothek einen Thread pro gleichzeitiger HTTP-Anfrage, wie HttpURLConnection könnte? Kopiert es zu einem gewissen Grad?Wie verwendet Jetty HttpClient Threads?

Ich definiere einen API-Client, der in meiner Anwendung langlebig sein wird, und ich versuche, einen geringen Platzbedarf auszugleichen und eine gute gleichzeitige Leistung zu ermöglichen.

Vielen Dank für einen Einblick.

Antwort

4

Jettys HttpClient Thread-Pool ist standardmäßig Jettys QueuedThreadPool und daher startet es ein paar Threads.

Diese Threads werden verwendet, um DNS-Lookups durchzuführen (die in Java blockiert werden und nicht blockiert werden können) und um Antworten zu erhalten. Anforderungen können von Anwendungsthreads und von gepoolten Threads gesendet werden (letzteres, falls eine Anforderung in die Warteschlange gestellt wurde).

Jettys HttpClient ist vollständig blockierungsfrei, da es auf der Jetty NIO-Bibliothek basiert, die wiederum auf JDKs NIO-Bibliothek basiert. Als solche tut es nicht erfordern einen Thread pro Anfrage und es ist in der Lage, viele Anfragen/Antworten in wenigen Threads zu multiplexen.

Auch wenn HttpClient bei der Ausführung von Netzwerk-E/A nicht blockierend ist, gibt es Dinge wie Timeouts und DNS, die zusätzliche Threads erfordern, und deshalb sehen Sie zusätzliche Threads.

Wenn Sie einen geringen Platzbedarf und eine gute Gleichzeitigkeit ausgleichen müssen, müssen Sie auf jeden Fall versuchen, Ihren besten Platz zu finden, indem Sie den Executor auf HttpClient setzen.

Ein weiterer wichtiger Faktor zum Abstimmen ist die Anzahl der Wähler, die auf dem Niveau HttpClientTransportOverHTTP konfiguriert sind, siehe http://www.eclipse.org/jetty/documentation/current/http-client-transport.html#_http_1_1_transport.

Es gibt keine universelle Antwort auf die richtige Anzahl von Threads, da sie von vielen Faktoren abhängt. Wie gesagt, Sie müssen es ausprobieren und die verschiedenen Parameter einstellen.

Zum Beispiel, wenn Zieladressen sind alle gut bekannt (zB internes Netzwerk), können Sie den Standard asynchronen SocketAddressResolver mit ersetzen:

httpClient.setSocketAddressResolver(new SocketAddressResolver.Sync());

und dies wird von einem zusätzlichen Versand loszuwerden, das führt DNS-Suche

Die Anzahl der Selektoren kann je nach Hardware auf 1 für eine Anzahl von Sockeln gehalten werden, die normalerweise unter 1-5.000 liegen.

Je niedriger die Anzahl der verfügbaren Threads für HttpClient, desto länger die Latenzen, wenn die Last ansteigt. QueuedThreadPool ist in der Lage, neue Threads nach Bedarf zu erzeugen und sie zu beenden, wenn sie nicht mehr benötigt werden, sich elastisch verhalten (und daher normalerweise in der Standardkonfiguration belassen werden), aber Sie können je nach Fall unterschiedliche Konfigurationen ausprobieren.

Verwandte Themen