首页 > 解决方案 > gRPC 连接循环

问题描述

我们正在建立一个集群来处理 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);

标签: javagrpctensorflow-servinggrpc-java

解决方案


最佳做法是使用后备负载平衡

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

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

上述配置将确保终止粘性 gRPC 连接,并且 AWS ALB 可以完成其工作以统一负载均衡请求。

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


推荐阅读