不可用:保持活动失败。连接可能已经消失

UNAVAILABLE: Keepalive failed. The connection is likely gone

我在 Android 应用程序上使用 grpc-okhttp 对后端进行 RPC 调用。

这是客户端保活配置:

.keepAliveTime(2, TimeUnit.SECONDS)
.keepAliveTimeout(5, TimeUnit.SECONDS)
.keepAliveWithoutCalls(true)

我观察到连接在某个时刻中断但在应用重启之前永远不会恢复的情况。

我还没有找到一种方法来始终如一地重现它,但在生产中我看到了很多错误“不可用:Keepalive 失败。连接可能已经消失”。

根据我的理解,gRPC 应该自动重新连接,但看起来一旦 keep-alive 失败一次,它甚至都不会重新连接 - 后续请求立即失败,甚至不等待截止日期或 keep-alive 超时。

这可能是由于 delayed/failed 发现 Android 设备上的网络状态变化所致。 gRPC 提供AndroidChannelBuilder, which is trying to address this problem particularly. It uses Android ConnectivityManager接收网络状态更新,可以更快地响应网络变化。