我已经使用 Google 的 gRPC 工具包实现了服务器和客户端。在测试时,我注意到从客户端到服务器的 TCP 连接永远不会超过一个,无论Channel我构建了多少个实例。
我计划通过 HAProxy 使用 Google 所谓的“代理负载平衡”。因此,我需要从客户端(例如服务 A)到服务器(例如服务 B)的多个连接。如果创建的连接不超过一个,则 HAProxy 会为该连接选择一项服务,并且其他服务器都不会看到任何负载。
我尝试ChannelOptions.MaxConcurrentStreams在客户端和服务器端(以及双方同时)使用两者,但没有任何运气。如前所述,我创建了多个Channel实例,但无济于事。我发现的唯一有效的技术是创建多个进程,但由于显而易见的原因,这并不理想。
我该怎么做才能完全启用 Google 的“代理负载平衡”场景?
目前,没有直接的方法可以强制使用我们现有的 API 创建新连接。正如我在评论中提到的,这可以通过我们的 C-Core 实现(由 gRPC C# 包装)来完成,只需提供不同的ChannelArgs,它们代表连接的参数,并且在存在时,确保为每个集合创建单独的连接的独特ChannelArgs. 但是,仅使用不同的通道参数来获取同一连接的新副本并不是 API 的预期用例,因此不存在真正无意义的通道参数,除了确保建立新连接之外不会改变任何内容。
但是,有一个正在进行的 PR正在添加一个通道参数,该参数显式强制子通道(连接)共享仅发生在单个通道实例内。设置后,这将避免在通道实例之间共享连接,并允许您确保每个通道创建一个新连接。