通过分片去 grpc 负载均衡

go grpc load balancing by sharding

是否可以在平衡器级别实现 gRPC 客户端分片?

假设我想将我的请求分片到服务 foosvc,我预先将其命名为 3 台服务器(foosvc1foosvc2foosvc3)并且我希望 client1 始终连接到服务器 foosvc1client2foosvc2 等。我尝试创建自定义平衡器,但我看不到任何访问请求元数据的方法平衡器内部。

我可以创建一个自定义平衡器(基于 balancer 包)来执行此操作,还是我需要有多个 grpc 客户端并在我的调用逻辑中解决这个问题?或者这可能是某种反模式并且有更好的解决方案?

gRPC Load Balancing 可能有兴趣?

我不熟悉那个 gRPC 包,但它可能(!?)面向反向代理,这并不是您真正想要的。

我认为您可能会从实施路由客户端(或后备)中受益。

尽管它们 运行 具有相同的功能服务,但您的后端不是同类的,因为客户端 X 必须始终路由到服务器 f(X)。

我认为 - 理想情况下 - 您可能希望考虑像 etcd、Redis、Consul(或自己的解析器)这样的东西来托管您的后端服务器列表。当然,该服务本身可以是 gRPC 服务。

NOTE you could LB requests over this resolver to provider higher availability.

并且客户端或此代理持有分片功能。

您无疑已经意识到,分片的一大挑战是提供公平的负载平衡(客户端绑定到服务器)和重新平衡|重新分片。但是,你没有问那个问题:-)

对于正在查看此内容的任何人。诀窍是在上下文中将“分片键”传递给 Picker,然后 Picker 可以使用它来计算哈希并决定使用哪个子连接。有关实施示例,请参阅 https://github.com/liyue201/grpc-lb/blob/master/balancer/consistent_hash.go