HttpClients PoolingHttpClientConnectionManager 和 DNS 缓存

Kev*_*n M 5 java dns caching apache-httpclient-4.x

所以我在使用 PoolingHttpClientConnectionManager 时似乎遇到了与 DNS 主机名解析缓存相关的问题。我有一个 api 可以调用外部服务。此服务使用 Akamai 边缘缓存,因此 IP 地址可能会更改。这个 api 负载很重。我为池大小设置了 100 个最大连接,空闲超时线程在空闲 30 秒后关闭空闲连接。但是由于交通繁忙,我认为连接永远不会空闲。因此,如果此服务主机的 IP 地址发生更改,我的应用程序似乎永远不会接受该更改,因为池中的所有连接都保留了旧的 DNS 解析的 IP 地址。

我已经通过更改我的 mac 上的 /etc/hosts 文件(并刷新操作系统缓存)在本地测试了这个假设。只要我的 API 应用程序有稳定的流量,即使在 java.security 中设置了 5 秒的 TTL,它也永远不会改变。在将主机名更改为指向会导致调用失败的无效 IP 地址后,我让它运行了 20 分钟,并且它从未失败过。我停止了我正在发送的 JMeter 流量,等待大约 30 秒并手动点击它,但呼叫失败,告诉我它接受了更改。

有任何想法吗?我需要停止使用连接池吗?或者编写我自己的 DnsResolver(不确定它应该如何工作)?如果此服务的 DNS 条目发生更改,我如何确保连接池中的连接会更新?

Kev*_*n M 6

因此,我以某种方式忽略了采用 TimeToLive 值的 PoolingHttpClientConnectionManager 的构造函数。这似乎为每个创建的连接设置了过期时间。我对其进行了测试,它肯定会在该 TTL 值之后获取本地主机文件中的更改。我只是不知道这是否是解决我的问题的正确方法。如果我没有听说其他选项,我会认为这是我的问题的正确答案。