【问题标题】:GRPC client side load balancing : One of node goes downGRPC 客户端负载平衡:其中一个节点出现故障
【发布时间】:2019-06-18 00:52:55
【问题描述】:

对于 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 类处理活动服务器列表?

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

【问题讨论】:

  • 在哪里可以找到类 MulipleHostsNameResolverProvider
  • 它是自定义类,感谢您的指出..将类的名称更改为 CustomNameResolverProvider

标签: java load-balancing grpc


【解决方案1】:

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

Pick First(默认),遍历地址直到一个工作。 Round Robin 仅对工作连接进行循环。所以你所描述的应该可以正常工作。

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

【讨论】:

  • 关于添加新工人的好点,需要测试场景。您能否建议一些在 GRPC 客户端中添加工作人员的最佳实践?目前在配置服务器中配置了服务器属性列表,客户端将读取并初始化通道。
  • 实施您自己的名称解析器可以让您注意到更新。我不知道传递给名称解析器需要多少配置,但包括它是目标名称(例如,“yournr:///the_config_you_need”)对于有限的数据量来说并不算太痛苦。跨度>
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多