代码之家  ›  专栏  ›  技术社区  ›  simpadjo

Java Grpc:使dns缓存无效

  •  0
  • simpadjo  · 技术社区  · 6 年前

    我有一个grpc客户端指向一个url,该url解析为2个IP地址。 问题是,当一个服务器节点宕机后又返回时,grpc客户端不会选择它,所有负载都会转移到一个节点上。

    我试着改变 networkaddress.cache.ttl 这很好,但没用。 我的代码(在Scala中)

    java.security.Security.setProperty("networkaddress.cache.ttl", "30")
    System.setProperty("networkaddress.cache.ttl", "30")
    val channel = NettyChannelBuilder.forAddress(host, port).nameResolverFactory(
          new DnsNameResolverProvider).usePlaintext().build
    val client = MyServiceGrpc.newStub(channel)
    

    grpc版本:1.32.1

    0 回复  |  直到 6 年前
        1
  •  2
  •   Arghavan Semo    6 年前

    假设DNS总是返回两个IP(可能是无序的),那么问题不在于DNS缓存。问题是gRPC有一个工作连接,因此不会选择重新连接,也不会执行DNS查询。

    您应该使用 MAX_CONNECTION_AGE 强制客户端偶尔重新连接以重新平衡负载。当客户端与服务器断开连接时,它们会触发新的DNS解析,因此这也可以用于查找新地址(尽管重新连接不会等待DNS解析完成)。

    在爪哇, 最大连接年龄 可通过 NettyServerBuilder.maxConnectionAge() :

    NettyServerBuilder.forPort(yourPort)
        .maxConnectionAge(30, TimeUnit.MINUTES)
        ....
    

    你想使用尽可能大的年龄。如果时间是30分钟,那么每个客户将每30分钟重新平衡一次。因此,在服务器重启15分钟后,该服务器的负载将减少,而在30分钟后,其负载将大致减少。

        2
  •  1
  •   simpadjo    6 年前

    配置负载平衡策略似乎可以完成以下任务:

    NettyChannelBuilder.forAddress(host, port).defaultLoadBalancingPolicy("round_robin").usePlaintext().build()