微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java Grpc:使DNS缓存无效

如何解决Java Grpc:使DNS缓存无效

我有一个grpc客户端,指向一个解析为2个IP地址的URL。 问题是,当一个服务器节点发生故障然后又恢复时,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

解决方法

假设DNS一直都返回两个IP(可能被改组),那么问题就出在DNS缓存上。问题在于gRPC的连接正常,因此不会选择重新连接并且不会执行DNS查询。

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

在Java中,MAX_CONNECTION_AGE可通过NettyServerBuilder.maxConnectionAge()使用:

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

您希望使用可以接受的最大年龄。在30分钟左右的时间内,每个客户将每30分钟重新平衡一次。因此,在服务器重新启动15分钟后,该服务器将承担1/4的负载,而在30分钟后,它将承担大约1/2的负载。

,

似乎可以配置负载平衡策略来完成这项工作:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。