java - 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);
解决方案
最佳做法是使用后备负载平衡。
但是,您可以做一些调整来终止客户端连接。
var builder = ManagedChannelBuilder.forAddress(mHost, mPort)
.keepAliveTime(15, TimeUnit.SECONDS)
.keepAliveTimeout(5, TimeUnit.SECONDS);
上述配置将确保终止粘性 gRPC 连接,并且 AWS ALB 可以完成其工作以统一负载均衡请求。
根据您的用例,您可以尝试其他选项,例如重试等。请参阅ManagedChannelBuilder
推荐阅读
- autocomplete - hereapi 的自动完成服务不起作用
- bash - 使用多个数组的 bash 脚本
- python - 根据另一列特定值的每次出现在 Pandas 中添加索引
- django - Django Channels 设置自定义 channel_name
- scala - 如何以orc格式在已经创建的hive表中加载excel数据
- python - 无法在 A2 共享主机上使用乘客 WSGI 将路由添加到 Flask
- javascript - 使用 `ref()` 获取 Firebase 存储中图像的下载 URL
- r - ggplot2 : different spacing for categorical x
- javascript - 如何在函数体中创建和传递对象?
- microsoft-graph-api - 类型 isof('microsoft.graph.message') 上的 Microsoft 图形过滤不起作用