我已经使用Google的gRPC工具包实现了服务器和客户端。在测试期间,我注意到从客户端到服务器的TCP连接永远不会超过一个,无论我构建了多少个Channel
实例。
我打算通过HAProxy使用Google所说的“ proxy load balancing”。因此,我需要从客户端(例如服务A)到服务器(例如服务B)的多个连接。如果创建的连接不超过一个,则HAProxy会为该连接选择一个服务,其他任何服务器都将看不到任何负载。
我曾尝试在客户端和服务器端(以及同时在两端)使用ChannelOptions.MaxConcurrentStreams
,但是没有任何运气。如前所述,我创建了多个Channel
实例,但无济于事。我发现的唯一有效技术是创建多个流程,由于明显的原因,这并不理想。
如何完全启用Google的“代理负载平衡”方案?
答案 0 :(得分:1)
当前,没有直接的方法可以使用我们现有的API强制创建新的连接。正如我在评论中提到的那样,只有提供不同的ChannelArgs
才能代表我们的C-Core实现(由gRPC C#包装),这些代表了连接的参数,并在存在时确保分开的连接为每组不同的ChannelArgs
创建。但是,仅使用不同的通道参数来获取同一连接的新副本并不是该API的预期用例,因此,除了确保建立新连接之外,没有真正的毫无意义的通道参数不会改变任何事情。
但是,有一个in-progress PR正在添加一个通道arg,该通道arg显式强制子通道(连接)共享仅在单个通道实例内发生。设置后,这将避免在通道实例之间共享连接,并允许您确保每个通道都创建一个新连接。
答案 1 :(得分:-1)
主要问题是,例如,在kubernetes外部连接到Istio / haproxy /负载均衡器时。 在我的场景中,我有一个负载均衡器ip(使用metallb),然后允许访问两个不同的容器实例,每个实例在不同的物理服务器上运行(以使其具有较高的可用性并提取更多的性能/吞吐量)。代替此行为,发生的是,即使我在同一应用程序中创建了许多“通道”,这些“通道”也共享相同的http2 / tcp会话,因此最终,将所有grpc请求发送到一个唯一的服务器。