【问题标题】:Java DNS doesn't respect AWS CloudMap round-robinJava DNS 不尊重 AWS CloudMap 循环
【发布时间】: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


    【解决方案1】:

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

    // Cache elements for one second
    java.security.Security.setProperty("networkaddress.cache.ttl" , "1")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2011-11-04
      • 2019-04-13
      相关资源
      最近更新 更多