【发布时间】:2021-04-29 13:20:01
【问题描述】:
我们正在使用 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 类的源代码中找到逻辑,但我没有发现任何问题...
你有什么解决办法吗?
【问题讨论】:
标签: java amazon-web-services dns