Какое максимальное время ожидания подключения к любому серверу? - PullRequest
0 голосов
/ 10 мая 2018

У меня есть это простое веб-приложение, основанное на загрузке Spring, которое загружает данные из нескольких API. Некоторые из них не отвечают вовремя, так как мой connectionTimeout настроен на 4 секунды.
Как только я избавляюсь от настройки connectionTimeout, я получаю исключения примерно через 20 секунд.

Итак, мой вопрос: как долго я могу пытаться подключиться к API и от чего это зависит? Откуда эти 20 секунд? Что, если API ответит через 40 минут, и я не смогу уловить этот конкретный момент и просто потерять данные. Я не хочу, чтобы это случилось. Какие у меня варианты?

Вот код для установки соединения. Ничего особенного.

HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
    clientHttpRequestFactory.setConnectTimeout(4000);
    RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);

Затем я получаю значения через:

 myObject.setJsonString(restTemplate.getForObject(url, String.class));

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

По умолчанию и максимум не имеет ничего общего с сервером. Это зависит от клиентской платформы, но это около минуты. Вы можете уменьшить его, но не увеличить. Четыре секунды слишком мало. В большинстве случаев измеряется десятками секунд.

А отсутствие или более длительное время ожидания соединения не вызывают каких-либо ошибок сервера. Вы тут лаете не на то дерево.

0 голосов
/ 10 мая 2018

Тайм-аут соединения означает, что ваша программа вообще не смогла подключиться к серверу в указанное время. Время ожидания может быть настроено, так как, как вы говорите, для подключения некоторых систем может потребоваться больше времени, и, если это известно заранее, его можно разрешить. В противном случае тайм-аут служит защитой для предотвращения бесконечного ожидания приложения, что в большинстве случаев не очень удобно для пользователя.

Обычно для чтения данных можно настроить отдельный тайм-аут (тайм-аут сокета). Они не включают друг друга.

Чтобы решить вашу проблему:

  1. Убедитесь, что сервер работает и принимает входящие соединения. Возможно, вы захотите использовать curl или, в зависимости от того, что именно ваш браузер пытается подключить.

  2. Если один инструмент может подключиться, а другой - нет, проверьте настройки брандмауэра и убедитесь, что исходящие подключения из вашей программы Java разрешены. Самый простой способ проверить, является ли это проблемой, это временно отключить антивирус и брандмауэр . Если это разрешает соединение, вам нужно либо отключить FW, либо лучше добавить соответствующее исключение.

  3. Оставьте тайм-аут на более высоком уровне (или попробуйте установить его на 0, который интерпретируется как бесконечный) во время тестирования. Как только он заработает, вы можете настроить его так, чтобы он соответствовал спецификациям вашего сервера и требованиям юзабилити.

Edit:

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

как долго я могу пытаться подключиться к API и от чего это зависит?

Скорее всего, сервер, на котором размещен API. Если он перегружен, время отклика может увеличиться.

Откуда эти 20 секунд?

Опять же, это зависит от сервера API. Он может быть случайным или обрабатывать каждый запрос в течение фиксированного периода времени, прежде чем окажется в состоянии ошибки. В этом случае это может занять 20 секунд каждый раз.

Что если API ответит через 40 минут, и я не смогу уловить этот конкретный момент и просто потерять данные. Я не хочу, чтобы это случилось. Какие у меня варианты?

  1. Используйте более надежный API, возможно, заплатив за гарантию обслуживания.
  2. Настройте время соединения и сокета, чтобы учесть возможности серверной стороны, если это известно заранее.
  3. Если ответ действительно 40 минут, это действительно плохой сервис, но перейдем к этому предположению - если набор данных настолько велик, исследуйте, предлагает ли API обратный вызов потоковой передачи, посредством чего вы передаете OutputStream в API методы библиотеки, в которые он будет (асинхронно) записывать ответ, когда он будет готов.
  4. Имейте в виду, что соединение и время ожидания сокета - это разные вещи После того, как вы подключились, тайм-аут соединения становится неактуальным (сокет установлен). Пока вы начинаете получать и продолжаете получать данные (от пакета к пакету) в течение времени ожидания сокета, время ожидания сокета также не сработает.
  5. Используйте бесконечные тайм-ауты (установите на 0), но это может привести к плохому удобству использования в ваших приложениях, а также к утечкам ресурсов, если сервер фактически отключен и никогда не будет отвечать. В этом случае у вас останутся оборванные связи.
0 голосов
/ 10 мая 2018

Попробуйте увеличить время ожидания.4 секунды это слишком мало.Для этого нужно будет подключить, сформулировать данные и вернуть.Таким образом, 4 секунды просто для подключения, к тому времени, когда оно пытается что-то вернуть, ваше приложение уже отключилось.

Установите 20 секунд для проверки.Вы можете установить его намного дольше, чтобы у API было достаточно времени для завершения.Это не означает, что ваше приложение будет использовать все время ожидания соединения.Это закончится, как только результат будет возвращен.Также API не предназначены для того, чтобы занимать много времени.Они выполнят задание и вернут результат как можно быстрее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...