gRPC 连接循环

gRPC connection cycling

我们正在设置一个集群来处理基于 gRPC 的推理(使用 Tensorflow Serving)。我们打算使用第 7 层负载均衡器 (AWS ALB) 来分配负载。对于我们的工作负载,每个客户帐户每分钟会进行多次推理。据我了解,gRPC 为每个通道保存连接状态。因此,为了让 ALB 完成它的工作,我们需要定期拆除并重建客户端实例上的连接。

我的问题:在 Java 中循环连接的最佳做法是什么?

下面是我建议的代码,每个客户端频道每隔几分钟就会调用一次。我 假设 当第一个连接被关闭时,我们可以着手创建一个新连接并立即向其发出请求;或者我们是否需要先等待先前的频道关闭。在我们的情况下,通道(很可能)是空的,因为上一个请求早 10 秒。

        if (mChannel != null) 
            mChannel.shutdown();
        
        mChannel = ManagedChannelBuilder.forAddress(mHost, mPort).usePlaintext().build();
        mStub    = PredictionServiceGrpc.newBlockingStub(mChannel);

最佳做法是使用 Lookaside Load Balancing

但是,您可以做一些调整来终止客户端连接。

var builder = ManagedChannelBuilder.forAddress(mHost, mPort)
.keepAliveTime(15, TimeUnit.SECONDS)
.keepAliveTimeout(5, TimeUnit.SECONDS);

以上配置将确保终止粘性 gRPC 连接,AWS ALB 可以统一负载均衡请求。

根据您的用例,您可以尝试其他选项,例如重试等。请参阅 ManagedChannelBuilder