我是否需要为多线程 Java GRPC (1.1.2) 客户端汇集 ManagedChannel 实例?

Do I need to pool ManagedChannel instances for a multithreaded Java GRPC (1.1.2) client?

TL;DR

grpc-java 的 ManagedChannel 是否有隐式连接池,或者 ManagedChannel 实例的池是用户的责任?


所以,我正在使用 java grpc 1.1.2 和 protoc 3.2.0。在我看来,grpc 为客户端提供的连接池没有隐式支持(截至目前)。然而,似乎 grpc 中连接的抽象,即 ManagedChannel 对象确实适用于多个 TCP 连接。那是对的吗?如果是这样,ManagedChannel 是否带有连接池?如果是这样的话,我可能不必担心连接池,因为通道是线程安全的,而且我可以简单地在我的客户端上使用单个 ManagedChannel 实例。但是,如果需要的话,我可能确实也必须合并这些通道对象以获得更大的吞吐量。 grpc 本身有这样的实现(通道池)吗?

是的,ManagedChannel 做连接池,你只需要一个。它会根据需要自动创建和销毁连接。

既然你说你想要池化以获得更大的吞吐量,我假设你想为一个通道中的一个地址创建和池化多个连接。它不受支持,因为通道实现仅用于为每个地址创建一个连接。使用即将取代旧版本的 LBv2,现在可以使用自定义 LoadBalancer in which you can create 连接任意数量的 Subchannel

如何自己写LoadBalancer可以参考股票pick-first and round-robinLoadBalancer