【问题标题】:How do I force my gRPC client to open multiple connections to the server?如何强制我的 gRPC 客户端打开到服务器的多个连接?
【发布时间】:2019-05-03 00:50:23
【问题描述】:

我已经使用 Google 的 gRPC 工具包实现了服务器和客户端。在测试时,我注意到从客户端到服务器的 TCP 连接永远不会超过一个,无论我构建了多少 Channel 实例。

我计划通过 HAProxy 使用 Google 所谓的“proxy load balancing”。因此,我需要从我的客户端(比如服务 A)到我的服务器(比如服务 B)的多个连接。如果创建的连接不超过一个,则 HAProxy 会为该连接选择一项服务,而其他任何服务器都不会看到任何负载。

我尝试在客户端和服务器端(同时在双方)使用ChannelOptions.MaxConcurrentStreams,但没有任何运气。如前所述,我创建了多个 Channel 实例,但无济于事。我发现唯一有效的技术是创建多个进程,这显然是不理想的。

如何才能完全启用 Google 的“代理负载平衡”方案?

【问题讨论】:

  • 您在使用 gRPC C++ 吗? “强制”多个连接的标准方法是使用不同的 ChannelArgs 创建您的频道,这将绕过否则会发生的子频道/连接共享。
  • C#,对不起,我只在标签中提到过。有没有我可以添加的无意义的 ChannelArg 不会改变任何东西但会破坏共享?
  • 把这种方法称为“标准方法”对我来说是夸大了。它会起作用,但不是预期用途,因此没有真正毫无意义的 ChannelArg 来实现此目的。

标签: c# haproxy grpc


【解决方案1】:

目前,没有直接的方法来强制使用我们现有的 API 创建新的连接。正如我在 cmets 中提到的,这可以通过我们的 C-Core 实现(由 gRPC C# 包装)来完成,只需提供不同的ChannelArgs,它表示连接的参数,并且在存在时确保创建单独的连接对于每组不同的ChannelArgs。但是,仅使用不同的通道参数来获取同一连接的新副本并不是 API 的预期用例,因此除了确保建立新连接之外,没有真正无意义的通道参数不会改变任何内容。

但是,in-progress PR 添加了一个通道参数,明确强制子通道(连接)共享仅在单个通道实例中发生。设置后,这将避免通道实例之间共享连接,并允许您确保每个通道都创建一个新连接。

【讨论】:

  • 现已合并。使用:ChannelArguments args; args.SetInt(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL, 1);grpc::CreateCustomChannel()
猜你喜欢
  • 2019-12-05
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 2021-08-17
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多