我们正在使用 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
它表明循环在 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
========
我们可以在这里看到,结果总是首先返回相同的地址,但另外两个是平衡的......我试图在 openjdk-11 存储库( https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.base/share/classes/java/net/InetAddress.java )的 InetAddress 类的源代码中找到逻辑,但我没有看到任何问题......
你有什么解决办法吗?
最佳答案
如果更改缓存策略无法正常工作,您可以更改 DNS 缓存条目的 TTL 设置 networkaddress.cache.ttl
属性(property):
// Cache elements for one second
java.security.Security.setProperty("networkaddress.cache.ttl" , "1")
关于Java DNS 不遵守 AWS CloudMap 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67318231/