HttpClients PoolingHttpClientConnectionManager 和 DNS 缓存
HttpClients PoolingHttpClientConnectionManager and DNS caching
所以我似乎遇到了一个与使用 PoolingHttpClientConnectionManager 时缓存 DNS host 名称解析相关的问题。我有一个 api 可以调用外部服务。此服务使用 Akamai 边缘缓存,因此 pos 可以更改 IP 地址。 api 负载很重。我为池大小设置了 100 个连接最大值,并在空闲 30 秒后使用空闲超时线程 closing 空闲连接。但是在交通繁忙的情况下,我认为连接永远不会空闲。因此,如果此服务的 IP 地址更改 host,我的应用程序似乎永远不会接收到该更改,因为池中的所有连接都保留在旧的 DNS 解析 IP 地址上。
我通过更改 mac 上的 /etc/hosts 文件(并刷新 os 缓存)在本地测试了这个假设。只要我的 API 应用程序有稳定的流量,即使在 java.security 中设置了 5 秒的 TTL,它也永远不会接收到更改。在将 hostname 更改为指向会导致调用失败的无效 IP 地址后,我让它 运行 持续 20 分钟,而且它从未失败过。我停止了我正在发送的 JMeter 流量,等待大约 30 秒并手动点击它,调用失败,告诉我它收到了更改。
有什么想法吗?我需要停止使用连接池吗?或者编写我自己的 DnsResolver(不确定它应该如何工作)?如果此服务的 DNS 条目发生更改,我如何确保连接池中的连接会更新?
所以我以某种方式忽略了采用 TimeToLive 值的 PoolingHttpClientConnectionManager 的构造函数。这似乎为每个创建的连接设置了一个过期时间。我对其进行了测试,它肯定会在此 TTL 值之后获取我本地主机文件中的更改。我只是不知道这是否是解决我的问题的正确方法。如果我没有听到其他选项,我会认为这是对我的问题的正确答案。
所以我似乎遇到了一个与使用 PoolingHttpClientConnectionManager 时缓存 DNS host 名称解析相关的问题。我有一个 api 可以调用外部服务。此服务使用 Akamai 边缘缓存,因此 pos 可以更改 IP 地址。 api 负载很重。我为池大小设置了 100 个连接最大值,并在空闲 30 秒后使用空闲超时线程 closing 空闲连接。但是在交通繁忙的情况下,我认为连接永远不会空闲。因此,如果此服务的 IP 地址更改 host,我的应用程序似乎永远不会接收到该更改,因为池中的所有连接都保留在旧的 DNS 解析 IP 地址上。
我通过更改 mac 上的 /etc/hosts 文件(并刷新 os 缓存)在本地测试了这个假设。只要我的 API 应用程序有稳定的流量,即使在 java.security 中设置了 5 秒的 TTL,它也永远不会接收到更改。在将 hostname 更改为指向会导致调用失败的无效 IP 地址后,我让它 运行 持续 20 分钟,而且它从未失败过。我停止了我正在发送的 JMeter 流量,等待大约 30 秒并手动点击它,调用失败,告诉我它收到了更改。
有什么想法吗?我需要停止使用连接池吗?或者编写我自己的 DnsResolver(不确定它应该如何工作)?如果此服务的 DNS 条目发生更改,我如何确保连接池中的连接会更新?
所以我以某种方式忽略了采用 TimeToLive 值的 PoolingHttpClientConnectionManager 的构造函数。这似乎为每个创建的连接设置了一个过期时间。我对其进行了测试,它肯定会在此 TTL 值之后获取我本地主机文件中的更改。我只是不知道这是否是解决我的问题的正确方法。如果我没有听到其他选项,我会认为这是对我的问题的正确答案。