Java Grpc:使 dns 缓存无效
Java Grpc: invalidate dns cache
我有一个指向 url 的 grpc 客户端,它解析为 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
假设 DNS returns 两个 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 分钟后,该服务器将具有 ¼ 的负载,而在 30 分钟后,它将具有大约 ½。
似乎配置 load-balancing 策略可以完成工作:
NettyChannelBuilder.forAddress(host, port).defaultLoadBalancingPolicy("round_robin").usePlaintext().build()
我有一个指向 url 的 grpc 客户端,它解析为 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
假设 DNS returns 两个 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 分钟后,该服务器将具有 ¼ 的负载,而在 30 分钟后,它将具有大约 ½。
似乎配置 load-balancing 策略可以完成工作:
NettyChannelBuilder.forAddress(host, port).defaultLoadBalancingPolicy("round_robin").usePlaintext().build()