【问题标题】:UNAVAILABLE: Keepalive failed. The connection is likely gone不可用:保活失败。连接可能已经消失
【发布时间】:2021-02-04 14:48:57
【问题描述】:

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

这是客户端保活配置:

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

我观察到连接在某些时候断开但在应用重新启动之前从未恢复的情况。

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

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

【问题讨论】:

  • 你试过AndroidChannelBuilder吗?它在 Android 上具有更好的网络监控功能,可以更快地响应网络变化。
  • 我没有。看起来很有希望。会试一试。谢谢!
  • @voidzcy 如果您发布答案,我会将其标记为已接受。
  • 当然,很高兴听到我的建议有帮助。

标签: android grpc grpc-java


【解决方案1】:

这可能是由于在 Android 设备上发现网络状态更改的延迟/失败所致。 gRPC 提供了AndroidChannelBuilder,专门解决了这个问题。它使用AndroidConnectivityManager接收网络状态更新,可以更快地响应网络变化。

【讨论】:

  • 不幸的是,问题似乎只是部分解决了。仍然存在连接断开且未重置的情况。
  • 你能描述一下实际发生的情况吗?我们看到其他用户说 RPC 在网络恢复时失败(请参阅grpc-java#5610)。
  • 从生产日志中我发现用户从服务器所在的 wifi 网络断开连接,然后在某个时候重新连接它,但连接已经消失并且没有重新协商。这导致他们反复尝试调用服务器的操作,但错误为“UNAVAILABLE:Keepalive failed。连接可能已消失”或只是“UNAVAILABLE”。启动请求后立即抛出错误,因此看起来 gRPC 甚至没有尝试重新连接。
  • 这似乎正是 grpc-java#5610 的用途。通常 gRPC 具有指数退避的自动重新连接。使用 AndroidChannelBuilder,它会在 Android ConnectivityManager 通知网络恢复时立即重置回退。但是,新的 RPC 生成和重新连接成功之间存在竞争。如果前者先发生,RPC 会立即失败。我们可能会修复此问题,以便在下一个版本中重新连接通道时缓冲新呼叫。如果不涉及其他影响,这将是一个简单的解决方案。
  • 在我的情况下,重新连接永远不会发生,所以我不确定这是同一个问题。用户不断尝试该操作,它总是立即失败,直到他们重新启动应用程序。我怀疑这可能与发生网络状态变化的不同条件有关——比如应用程序处于后台、手机处于待机状态、连接到不同的 wifi 等。虽然我的应用程序有一个前台服务来确保它总是正在运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2012-01-23
相关资源
最近更新 更多