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.