Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Grpc:使dns缓存无效_Java_Grpc_Grpc Java - Fatal编程技术网

Java Grpc:使dns缓存无效

Java Grpc:使dns缓存无效,java,grpc,grpc-java,Java,Grpc,Grpc Java,我有一个指向url的grpc客户端,该url解析为2个IP地址。 问题是,当一个服务器节点宕机后又返回时,grpc客户端不会拾取它,所有负载都会转移到单个节点 我尝试更改networkaddress.cache.ttlproperty,但没有效果。 我的代码(在Scala中) grpc版本:1.32.1假设DNS始终返回两个IP(可能是无序的),那么问题不在于DNS缓存。问题是gRPC有一个工作连接,因此不会选择重新连接,也不会执行DNS查询 您应该将服务器配置为强制客户端偶尔重新连接以重新平衡

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

我尝试更改
networkaddress.cache.ttl
property,但没有效果。 我的代码(在Scala中)


grpc版本:1.32.1

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

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

在Java中,
MAX\u CONNECTION\u AGE
可通过以下方式获得:

NettyServerBuilder.forPort(您的端口)
.maxConnectionAge(30,时间单位:分钟)
....

您希望使用尽可能大的年龄。如果时间为30分钟,那么每个客户机将每30分钟重新平衡一次。因此,在服务器重新启动15分钟后,该服务器将有¼的负载,30分钟后将有大约½的负载。

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

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

谢谢你的回复,我也看到了这个选项。对我来说,这看起来像是一种黑客行为:启动关闭连接并不是每个服务器实例的责任。我添加了
defaultLoadBalancingPolicy
参数(参见我的回答),它似乎很有帮助。请您对此发表意见好吗?
循环运行
将使每个客户端始终连接到每个服务器。这可能是一个很好的方法。但是如果DNS返回的地址发生变化,您仍然需要
MAX\u CONNECTION\u AGE
让客户端注意到这些新地址。这就是基于DNS的基础设施的工作原理;HTTP之类的东西几乎总是不断地创建连接。很抱歉,如果这不符合主题,那么客户端无法不时刷新地址列表并自行重新平衡工作负载有什么根本原因吗?在大规模部署中,DNS服务器通常会返回服务器地址的子集。这些服务器每次响应都返回不同的结果。还有一个问题是客户应该多久进行一次民意调查。“客户端轮询”策略对pick_first没有帮助,因为客户端将继续支持其已建立的连接
MAX_CONNECTION_AGE
对于L4负载平衡是非常必要的,并且也可以用于这些其他方法。它还避免了客户端中的硬编码配置。仅配置循环LB策略+k8s headless服务将无法检测到新的pod IP(如果扩展)。服务器端需要一些黑客,我们需要设置max_connection_age_ms和max_connection_age_grace_ms
NettyChannelBuilder.forAddress(host, port).defaultLoadBalancingPolicy("round_robin").usePlaintext().build()