Конфигурация соединения Apache HttpClient - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь настроить HttpClient через HttpClientBuilder .Я также взглянул на HttpClientConnectionManager , и здесь началась путаница.

В ConnectionManager или, точнее, PoolingHttpClientConnectionManager существуют методы для:

  • закрыть истекшие соединения
  • закрыть простаивающие соединения

Когда считается, что соединение истекло?
Когда оно простаивает?
Что происходит, когда соединение отбассейн закрыт?Гарантируется ли, что при необходимости создаются соединения?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

HTTP основан на TCP, который управляет отправкой и получением пакетов в правильном порядке и запрашивает повторные передачи, если пакеты были утеряны в середине пути.TCP-соединение начинается с TCP-рукопожатия, состоящего из сообщений SYN, SYN-ACK и ACK, в то время как оно заканчивается сериями FIN, ACK-FIN и ACK, как видно из этого изображения.взято из Wikipedia enter image description here

Хотя HTTP является протоколом запроса-ответа, открытие и закрытие соединений довольно дорого, и поэтому HTTP / 1.1 позволяет повторно использовать существующие соединения,С заголовком Connection: keep-alive т.е. вы говорите своему клиенту (т.е. браузеру), чтобы соединение оставалось открытым для сервера.Сервер может иметь несколько тысяч и тысяч открытых соединений одновременно.Во избежание истощения ресурсов сервера соединение обычно своевременно ограничено.Через время ожидания сокета незанятые соединения или соединения с определенными проблемами соединения (нарушенный доступ в Интернет, ...) автоматически закрываются сервером через некоторое предварительно определенное время.

Множество реализаций HTTP, таких как Apache HTTP клиент 4.4 и выше, проверьте состояние соединения только тогда, когда оно собирается его использовать.

Обработка устаревших соединений была изменена в версии 4.4.Ранее код проверял каждое соединение по умолчанию перед повторным использованием.Теперь код проверяет соединение, только если истекшее время с момента последнего использования соединения превышает установленное время ожидания.Время ожидания по умолчанию установлено на 2000 мс ( Источник )

Если, следовательно, какое-то время соединение не использовалось, клиент, возможно, не прочитал ACK-FIN с сервераи поэтому все еще думают, что соединение открыто, когда оно фактически уже было закрыто сервером некоторое время назад.Такое соединение истекает и обычно называется полузакрытым.Поэтому он может быть собран пулом.

Обратите внимание, что если вы отправляете запросы, включающие заголовок HTTP Connection: close, соединение должно быть закрыто сразу после того, как клиент получил ответ.

Состояние открытых соединений можно проверить с помощью netstat, которое должно присутствовать в большинстве современных операционных систем.Недавно мне пришлось проверить одного из наших HTTP-клиентов, управление которым осуществлялось через стороннюю библиотеку, которая неправильно распространяла заголовок Connection: Close и поэтому приводила к множеству полузакрытых соединений.

0 голосов
/ 04 февраля 2019

Согласно: https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

HttpClient пытается устранить проблему, проверяя, является ли соединение «устаревшим», которое больше недействительно, поскольку оно было закрыто на стороне сервера, доиспользуя соединение для выполнения HTTP-запроса.Проверка устаревшего соединения не является надежной на 100%.Единственное возможное решение, которое не предусматривает использование одного потока на модель сокета для незанятых соединений, - это выделенный поток мониторинга, используемый для удаления соединений, которые считаются устаревшими из-за длительного периода бездействия.Поток монитора может периодически вызывать метод ClientConnectionManager # closeExpiredConnections () для закрытия всех соединений с истекшим сроком действия и удаления закрытых соединений из пула.При желании он также может вызвать метод ClientConnectionManager # closeIdleConnections (), чтобы закрыть все соединения, которые простаивали в течение определенного периода времени.

Разница между просроченным и незанятым состоянием заключается в том, что истекшее соединение было закрытона стороне сервера, хотя незанятое соединение не обязательно закрыто на стороне сервера, но оно простаивает в течение определенного периода времени.Когда соединение закрыто, оно снова становится доступным в используемом пуле.

...