【问题标题】:go grpc load balancing by sharding通过分片进行 grpc 负载均衡
【发布时间】:2020-06-19 16:33:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: go grpc grpc-go


    【解决方案1】:

    gRPC Load Balancing 可能感兴趣?

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

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

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

    我认为——理想情况下——您可能希望考虑使用诸如 etcd、Redis、Consul(或滚动您自己的解析器)之类的东西来托管您的后端服务器列表。当然,这个服务本身也可以是一个 gRPC 服务。

    注意您可以通过此解析器对请求进行 LB 以提供更高的可用性。

    客户端或者这个代理持有分片功能。

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

    【讨论】:

    • look-aside lb 似乎很有趣,但我不认为,它会解决为每个请求选择实例的问题(尽管我没有尝试过,可能是错误的)根据一些价值。查看我的最终解决方案的答案
    【解决方案2】:

    对于任何看到这个的人。诀窍是在上下文中将“分片密钥”传递给 Picker,然后它可以使用它来计算哈希并决定使用哪个子连接。实现示例见https://github.com/liyue201/grpc-lb/blob/master/balancer/consistent_hash.go

    【讨论】:

      猜你喜欢
      • 2017-09-30
      • 2020-05-26
      • 2017-07-29
      • 2022-01-17
      • 1970-01-01
      • 2021-03-18
      • 2018-10-27
      相关资源
      最近更新 更多