Похоже, у меня возникла проблема, связанная с кэшированием разрешения имен хостов DNS при использовании PoolingHttpClientConnectionManager. У меня есть API, который обращается к внешней службе. Эта служба использует пограничное кэширование Akamai, поэтому IP-адрес может измениться. Этот API находится под большой нагрузкой. У меня установлено максимальное количество подключений 100 для размера пула с потоком тайм-аута простоя, закрывающим простаивающие соединения после 30 секунд простоя. Но из-за интенсивного трафика я не думаю, что соединения когда-либо простаивают. Таким образом, похоже, что если IP-адрес этого узла службы изменится, мое приложение никогда не уловит это изменение, поскольку все соединения в пуле сохраняют старый IP-адрес, разрешенный DNS.
Я проверил эту гипотезу локально, изменив файл /etc/hosts на своем Mac (и очистив кеш операционной системы). Пока к моему приложению API поступает постоянный трафик, оно никогда не фиксирует изменения, даже если в java.security установлено значение TTL, равное 5 секундам. Я дал ему поработать 20 минут после изменения имени хоста, чтобы оно указывало на неверный IP-адрес, который мог бы привести к сбою вызовов, и он ни разу не вышел из строя. Я остановил трафик JMeter, который отправлял, подождал около 30 секунд и ударил его вручную, но вызов не удался, сообщив мне, что он принял изменение.
Есть идеи? Нужно ли мне прекратить использование пула соединений? Или написать свой DnsResolver (не знаю, как он должен работать)? Как я могу гарантировать, что соединения в моем пуле соединений будут обновляться, если запись DNS для этой службы изменится?
Подробнее здесь: https://stackoverflow.com/questions/291 ... ns-caching