Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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客户端负载平衡:一个节点发生故障_Java_Load Balancing_Grpc - Fatal编程技术网

Java GRPC客户端负载平衡:一个节点发生故障

Java GRPC客户端负载平衡:一个节点发生故障,java,load-balancing,grpc,Java,Load Balancing,Grpc,对于Grpc服务,使用客户端负载平衡 频道创建 ManageChannelBuilder.forTarget("host1:port,host2:port,host3:port").nameResolverFactory(new CustomNameResolverProvider()).loadBalancerFactory(RoundRobinBalancerFactory.getInstance()).usePlaintText(true).build(); 使用此通道创建存根 问题 M

对于Grpc服务,使用客户端负载平衡

频道创建

ManageChannelBuilder.forTarget("host1:port,host2:port,host3:port").nameResolverFactory(new CustomNameResolverProvider()).loadBalancerFactory(RoundRobinBalancerFactory.getInstance()).usePlaintText(true).build();
使用此通道创建存根

问题

ManageChannelBuilder.forTarget("host1:port,host2:port,host3:port").nameResolverFactory(new CustomNameResolverProvider()).loadBalancerFactory(RoundRobinBalancerFactory.getInstance()).usePlaintText(true).build();
如果服务[host1]中的一个宕机,那么存根是否会处理此场景,并且不会向服务[host1]发送任何进一步的请求

根据以下文件:

厚客户端方法意味着负载平衡smarts 在客户端实现。客户负责跟踪 可用服务器的数量、它们的工作负载以及用于 选择服务器。客户机通常集成以下库: 与其他基础架构(如服务发现、名称)通信 决议、配额管理等

那么,是ManagedChannel类负责维护活动服务器列表,还是应用程序代码需要维护活动服务器列表,并每次使用活动服务器列表创建ManagedChannel实例

测试结果

根据测试,如果其中一个服务宕机,则不会影响负载平衡,并且所有请求都得到正确处理

那么,可以假定存根或ManagedChannel类处理活动服务器列表吗


如果您能提供文档作为答案,我们将不胜感激。

负载平衡器通常会处理出现故障的节点。即使由外部服务管理,节点也可能突然崩溃,负载平衡器希望避开这些节点。因此,我所知道的gRPC的所有负载平衡器实现都可以避免在后端关闭时调用失败

先拾取(默认设置),遍历地址,直到其中一个地址起作用。循环使用仅在工作连接上循环使用。所以你所描述的应该很好


我将注意到,您的方法确实有一个缺点:您不能在进程运行时更改服务器。删除损坏的后端是一回事,但添加新的工作后端是另一回事。如果您的负载过高,您可能无法通过添加更多的工作人员来解决问题,因为即使您添加更多的工作人员,您的客户端也无法连接到他们。

添加新工作人员的好处在于,需要测试场景。您能否建议在GRPC客户端添加工作人员的一些最佳做法?当前,服务器属性列表在配置服务器中配置,客户端将读取和初始化通道。实现自己的名称解析程序将允许您注意更新。我不知道传递给名称解析程序需要多少配置,但包括它的是目标名称(例如“yournr:///the_config_you_need)对于有限的数据量来说并不是太痛苦。在这里我们可以找到类MulipleHostsNameResolverProviderIt是自定义类,感谢您的提示..将类名更改为CustomNameResolverProvider