繁体   English   中英

Java gRPC 自定义客户端负载均衡

[英]Java gRPC Custom Client-side load balancing

我使用 gRPC 编写了一个 Java 应用程序。 正如我查看文档: https://github.com/grpc/grpc/blob/master/doc/load-balancing.md

并在博客中: https://grpc.io/blog/grpc-load-balancing

有一些可用的 gRPC 应用程序级客户端负载均衡器:

  • grpclb
  • 选择第一
  • 循环赛

它们都不符合我的需要。 我需要实现一个自定义。 问题是我找不到怎么做——不是在文档中,也不是在谷歌搜索/stackoverflow中。

在 App 中,每台服务器都服务于几个租户。 当创建新租户并且达到每台服务器的租户最大限制时 - 需要启动新服务器。

我在这里看到两个我需要解决的问题:

  1. 当新服务器动态启动时 - 我如何添加从客户端到该服务器的新 http/2 连接(据我所知 - 这意味着添加新的子通道)?
  2. 我需要通过它所服务的租户名称将每个请求指向正确的服务器。 我可以在代码服务器注册表中实现以了解哪些服务器已启动以及它们每个服务的租户。 但主要问题是
  • 如何实现自定义请求平衡?
  • 我需要实现/覆盖什么 class 以动态提供服务器 IP 指向每个请求?

在 grpc-java 中,您可以实现自定义io.grpc.LoadBalancer 它控制创建哪些子通道(与服务器的连接),并为每个请求选择使用哪个子通道。 他们是先进的,没有例子。 有文档,但您可能需要查看RoundRobinLoadBalancer 实现

要引导单个请求,客户端应用程序可以将租户 ID 附加为元数据(带有拦截器)或使用自定义 CallOptions,它们在 stub 上可用 然后在您的LoadBalancer.Picker中,您将从LoadBalancer.pickSubchannelArgs读取该 ID。

通常使用NameResolver发现地址,但在您的情况下,LoadBalancer 直接调用任何远程服务来查找地址可能更合适。 这实际上是在 grpclb 中所做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM