Java DNS 不遵守 AWS CloudMap 循环

标签 java amazon-web-services dns

我们正在使用 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/

相关文章:

azure - 如何将SSL添加到Azure容器实例应用程序?

linux - 使用 getaddrinfo 缓存 DNS

java - Apache CXF 拦截器配置

java - 使用 jdeps + jlink + jpackage 构建 Windows 自包含应用程序后的 EXCEPTION_ACCESS_VIOLATION

Java,Object.hashCode() 结果在所有 JVM/系统中都是常量?

bash - 引导新的 EC2 实例时使用 UserData 中的内部函数

amazon-web-services - 通过 CloudFront 提交 PUT 请求

将 http 重定向到 https AWS ELB 而无需在网络服务器上托管 ssl 证书

ssl - Cloudflare 和 Heroku 之间的加密

java - 数组转换为列表错误