Od pewnego czasu używam HttpClient w środowisku wielowątkowym. Dla każdego wątku, gdy zainicjuje połączenie, utworzy zupełnie nową instancję HttpClient.Najlepsza praktyka używania HttpClient w środowisku wielowątkowym
Niedawno odkryłem, że za pomocą tego podejścia może to spowodować, że użytkownik będzie miał otwartych zbyt wiele portów, a większość połączeń będzie w stanie TIME_WAIT.
http://www.opensubscriber.com/message/[email protected]/86045.html
Stąd, zamiast każda nić sposób:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Planujemy:
[Metoda A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
W normalnej sytuacji, global_c będzie dostępny jednocześnie przez 50 wątków. Zastanawiam się, czy spowoduje to problemy z wydajnością? Czy MultiThreadedHttpConnectionManager używa mechanizmu blokującego, aby wdrożyć politykę bezpieczeństwa wątków?
Jeśli 10 wątków korzysta z global_c, czy pozostałe 40 wątków zostanie zablokowanych?
A może byłoby lepiej, gdyby w każdym wątku utworzyć wystąpienie HttpClient, ale zwolnić menedżera połączeń jawnie?
[Metoda B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Will connman.shutdown() cierpią problemy z wydajnością?
Czy mogę wiedzieć, która metoda (A lub B) jest lepsza, dla aplikacji używającej wątków 50 ++?
Kiedy zostanie wywołane "zamknięcie" w menedżerze połączeń, jeśli klient jest globalny. –
Które narzędzia/komendy linuksowe są przydatne do debugowania lub "wizualizowania" zachowania menedżera połączeń pod maską? Pytam, ponieważ mamy obecnie problemy z połączeniami w CLOSE_WAIT i innymi efektami, i walczymy o znalezienie dobrego sposobu, aby zobaczyć, co się właściwie dzieje. – Christoph
@WandMaker Jestem prawie pewny, że po prostu zadzwonisz do wyłączenia, gdy któryś z programów wyjdzie lub gdy skończysz z jakąś partią pracy, w której przez jakiś czas nie będziesz potrzebował żadnych połączeń. –