在没有 activity 的情况下保持 grpc 通道有效

keep grpc channel alive without activity

我们有一个系统,其中客户端打开双向 grpc 流到 ALB,代理到活动服务器之一。所以

双向 客户端 <------------> ALB <--------> 服务器

万一连接失败,客户端会重新连接到我们,因为我们希望保持双向通道打开并处于活动状态。

问题是:即使有一段时间 activity 没有,我们如何让频道保持活动状态。 ALB 配置了 300 秒的空闲超时,这意味着如果在 300 秒内没有数据包交换,它将断开连接。

我在 https://grpc.io/blog/grpc-on-http2/#keeping-connections-alive 的 grpc 页面上读到,我们应该在两侧使用保持活动设置。所以我尝试了以下配置

bi-di client channel with :  keepAliveWithoutCalls(true).keepAliveTime(90, TimeUnit.SECONDS).keepAliveTimeout(10, TimeUnit.SECONDS)

Server is configured with : permitKeepAliveWithoutCalls(true).permitKeepAliveTime(1, TimeUnit.MINUTES)

但我收到内部:HTTP/2 错误代码:PROTOCOL_ERROR 整整 5 分钟后收到第一个流。看起来 ALB 在 5 分钟后断开了连接。

知道如何让空闲连接保持活动状态吗?

我们不能使用原始的 http2 ping,因为 ALB 不支持它

我在客户端和服务器端用小实现修复了上面的问题:

a) 客户端每 1 分钟向服务器发送一些虚拟请求。这是在 proto buf 中通过传递某种类型(如虚拟请求)定义的实际请求。

b) 在收到上述每个此类请求时,服务器会以虚拟响应进行响应,客户端会根据虚拟响应等请求类型忽略该请求。

这样循环就完成了,LB 认为 http 连接上有一些 activity 并且它不会断开连接。