HttpClients PoolingHttpClientConnectionManager 和 DNS 缓存

问题描述 投票:0回答:1

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

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

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

java caching dns apache-httpclient-4.x
1个回答
8
投票

所以我不知何故忽略了

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

© www.soinside.com 2019 - 2024. All rights reserved.