Java DNS 不遵守 AWS CloudMap 循环

The*_*het 6 java dns amazon-web-services

我们正在使用 ECS Fargate 开发 Java 服务。我们希望使用自动扩展,以便我们的服务在 AWS CloudMap 中注册以进行 DNS 发现。

我今天遇到了一个非常奇怪的问题,所有调用都转到同一个服务实例。所以我在同一个 VPC 中启动了一个 EC2 到dig服务:

[ec2-user@.... ~]$ dig +short something.local
10.253.0.199
10.253.1.129
10.253.0.6
[ec2-user@.... ~]$ dig +short something.local
10.253.1.129
10.253.0.6
10.253.0.199
[ec2-user@.... ~]$ dig +short something.local
10.253.0.6
10.253.0.199
10.253.1.129
Run Code Online (Sandbox Code Playgroud)

它表明循环在 AWS 端正常工作......

我们禁用了 DNS 缓存并通过sun.net.InetAddressCachePolicy.get()返回 0验证了效果。

我们阅读了 OpenJDK 代码中的底层代码,显示getByName使用了返回的第一个条目getAllByName

然后我编写了java.net.InetAddress.getAllByName("something.local")一个每秒执行一次并打印结果的代码:

10.253.1.129
10.253.0.6
10.253.0.199
========
10.253.1.129
10.253.0.199
10.253.0.6
========
10.253.1.129
10.253.0.6
10.253.0.199
========
Run Code Online (Sandbox Code Playgroud)

我们可以在这里看到,结果总是首先返回相同的地址,但另外两个是平衡的......

我试图在 openjdk-11 repo ( https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.base/share/classes/java )的 InetAddress 类的源代码中找到逻辑/net/InetAddress.java)但我没有看到任何问题......

你有什么解决办法吗?

jam*_*ing 0

如果更改缓存策略无法正常工作,您可以使用以下命令更改 DNS 缓存条目设置属性的 TTL networkaddress.cache.ttl

// Cache elements for one second
java.security.Security.setProperty("networkaddress.cache.ttl" , "1")
Run Code Online (Sandbox Code Playgroud)