对于Grpc服务,使用客户端负载平衡。
频道创建
ManageChannelBuilder.forTarget("host1:port,host2:port,host3:port").nameResolverFactory(new CustomNameResolverProvider()).loadBalancerFactory(RoundRobinBalancerFactory.getInstance()).usePlaintText(true).build();
使用此通道创建存根。
问题
如果服务[host1]之一发生故障,那么存根(stub)是否将处理这种情况,并且不向服务[host1]发送任何进一步的请求?
根据https://grpc.io/blog/loadbalancing上的文档
胖客户端方法意味着在客户端中实现了负载平衡智能。客户端负责跟踪可用服务器,它们的工作负载以及用于选择服务器的算法。客户端通常集成与其他基础架构通信的库,例如服务发现,名称解析,配额管理等。
那么,ManagedChannel类的职责是维护活动服务器列表,还是应用程序代码需要维护活动服务器列表并每次使用活动服务器列表创建ManagedChannel实例?
测试结果
根据测试,如果一项服务中断,则不会影响负载平衡,并且所有请求都将得到正确处理。
因此,可以假定存根或ManagedChannel类都处理活动服务器列表吗?
回答文档将受到高度赞赏。
负载平衡器通常处理发生故障的节点。即使由外部服务进行管理,节点也可能突然崩溃,并且Load Balancer希望避免这些节点。因此,我知道所有gRPC的Load Balancer实施都可以避免后端关闭时调用失败。
选择第一(默认),遍历地址,直到工作为止。循环只循环在工作连接上的知更鸟。因此,您描述的内容应该可以正常工作。
我将注意到您的方法确实存在一个缺点:您无法在进程运行时更改服务器。删除损坏的后端是一回事,而添加新的工作后端则是另一回事。如果您的负载过高,则可能无法通过添加更多工作程序来解决该问题,因为即使您添加更多工作程序,您的客户端也无法连接到他们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句