我有一个 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 https://github.com/grpc/proposal/blob/master/A9-server-side-conn-mgt.md#proposal强制客户端偶尔重新连接以重新平衡负载。当客户端与服务器断开连接时,它们会触发新的 DNS 解析,因此这也可用于查找新地址(尽管重新连接不会等待 DNS 解析完成)。
在爪哇,MAX_CONNECTION_AGE
可以通过NettyServerBuilder.maxConnectionAge() https://grpc.github.io/grpc-java/javadoc/io/grpc/netty/NettyServerBuilder.html#maxConnectionAge-long-java.util.concurrent.TimeUnit-:
NettyServerBuilder.forPort(yourPort)
.maxConnectionAge(30, TimeUnit.MINUTES)
....
您希望使用您可以接受的尽可能大的年龄。如果时间是 30 分钟,那么每个客户端每 30 分钟就会重新平衡一次。因此,在服务器重新启动 15 分钟后,该服务器将具有 1/4 的负载,30 分钟后将具有大约 1/2 的负载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)