[Ежедневный свежий гриб] Исключение `org.apache.http.NoHttpResponseException` устранено

Микросервисы
[Ежедневный свежий гриб] Исключение `org.apache.http.NoHttpResponseException` устранено

Это исключение, вызванное HTTP, которое является случайным исключением.

журнал исключений

org.apache.http.NoHttpResponseException: The target server failed to respond

решение

серверное решение

Клиент может обнаружить, что срок действия службы истек, и автоматически закрыть ее.

  • Из кода отслеживания видно, что клиент читает Keep-Alive: timeout=xx из HttpHeader. Если он не прочитан, время ожидания никогда не истечет.
  • Второй параметр конфигурации Nginx таков, поэтому, пока сервер меняет keepalive_timeout 30s; на keepalive_timeout 30s 29s; здесь на 1с меньше, чтобы предотвратить проблемы параллелизма, вызванные сетевой задержкой.

Сценарий клиента

Если сервер не удобно модифицировать, то второе решение — модифицировать клиентскую часть, что более хлопотно.

  • Обязательно используйте последнююhttpClient.
  • Тогда есть три метода:
    1. заjestтакое времяcloseIdleConnection, время планирования можно настроить наkeep aliveменее половины времени, чтобы гарантировать переработку до тайм-аута
    2. в соответствии сkeep Aliveкорректировка времениvalidateAfterInactivity 小于keepAlive Time`, но этот метод все равно не может не закрыться при этом.
    3. Схема компенсации, используяRetryПопробуйте отправить еще раз.HttpClientПо умолчанию открыт автоматический повтор, не звонить.disableAutomaticRetriesПросто

Рекомендуемое решение

  1. Клиент использует короткое соединение, такое как переход наUrlConnection;
  2. будетHttpClientВремя поддержания соединения настроено менее чем на 15 с илиnginxизkeepalive_timeoutнастроить более 30 с;
  3. Не нужноPoolingHttpClientConnectionManager;
  4. Повторите попытку после ошибки,HttpClientизRetryHandler;
  5. JDK11 принесHttpClinet, разве это не привлекательно?