GRPC客户端负载平衡:节点之一关闭

时间:2019-01-24 10:10:31

标签: java load-balancing grpc

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

创建频道

ManageChannelBuilder.forTarget("host1:port,host2:port,host3:port").nameResolverFactory(new CustomNameResolverProvider()).loadBalancerFactory(RoundRobinBalancerFactory.getInstance()).usePlaintText(true).build();

使用此渠道创建存根。

问题

如果服务[host1]之一发生故障,那么存根是否将处理此情况,并且不向服务[host1]发送任何进一步的请求?

根据https://grpc.io/blog/loadbalancing上的文档

  

胖客户端方法意味着负载平衡智能   在客户端实施。客户负责跟踪   可用服务器,它们的工作量以及用于   选择服务器。客户端通常集成库   与其他基础架构进行通信,例如服务发现,名称   分辨率,配额管理等。

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

测试结果

根据测试,如果一项服务中断,则不会对负载平衡产生影响,并且所有请求都将得到正确处理。

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

非常感谢您提供文档答案。

1 个答案:

答案 0 :(得分:1)

负载均衡器通常处理发生故障的节点。即使由外部服务进行管理,节点也可能突然崩溃,并且Load Balancer希望避免这些节点。因此,我知道所有gRPC的Load Balancer实施都可以避免在后端故障时调用失败。

先选择“ Pick First”(默认设置),然后循环访问地址,直到有效为止。循环仅在工作连接上循环知更鸟。因此,您描述的内容应该可以正常工作。

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

相关问题