【问题标题】:gRPC looses connection upon server restartgRPC 在服务器重新启动时失去连接
【发布时间】:2025-12-24 04:50:10
【问题描述】:

我对 (g)rpc 有点陌生,我不太了解这个概念。我们在 Kubernetes 集群中有一组 NodeJS 服务器,它们通过 grpc 相互通信。 rpc 接口在客户端 upstart 上针对每个服务器设置。

我们最近发现,在重新启动服务器后,其客户端会失去与该服务器的连接。也就是说,在该服务器重新启动后,对服务器的先前工作的 rpc 调用不再工作。直到我们以正确的顺序重新启动服务器,它才会再次开始运行。

我想通过一个地址(主机+端口)告诉客户“这是一个你可以调用的程序”。并且在调用过程时,地址被调用,在服务器上处理并返回。如果它像这样工作,客户端不会关心服务器是否在 rpc 调用之间重新启动了 0 次或 100 次。

但是根据上面对客户端 rpc 调用失败/超时的描述,似乎有一个类似套接字的连接,在两个部分都在运行时建立和维护连接。

它是如何工作的,我是否需要在我的客户端上对我的 rpc 服务器实施健康检查,以便在服务器重新启动时重新建立接口?

感谢您的宝贵时间。

【问题讨论】:

  • 你使用的是什么版本的 gRPC?
  • 您看到哪些错误让您认为是这种情况?有时 gRPC 会记录警告但仍能正常工作。请在问题中更具描述性和具体性,以便人们可以提供帮助。

标签: node.js kubernetes grpc


【解决方案1】:

https://github.com/grpc/grpc/blob/master/doc/connectivity-semantics-and-api.md 建议通道从“transient_failure”变为“connecting”(并返回“ready”)最终,但由于指数退避,这可能需要很长时间。

https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md 描述了一个叫做MAX_BACKOFF 的东西。在https://github.com/grpc/grpc-node/blob/master/packages/grpc-js/src/channel.ts 中,这似乎被硬编码为两分钟。

【讨论】:

  • 如果可能,您能否更新损坏的链接?
  • 完成。请看一看。