gRPC DEADLINE_EXCEEDED 即使服务器已启动并且

Posted

技术标签:

【中文标题】gRPC DEADLINE_EXCEEDED 即使服务器已启动并且【英文标题】:gRPC DEADLINE_EXCEEDED even that the server is up and 【发布时间】:2018-01-02 15:05:11 【问题描述】:

我有两个通过 gRPC 相互通信的微服务,A 是 RPC 客户端,B 是 RPC 服务器,它们都是使用 grpc NPM 模块在 NodeJS 中编写的。

一切正常,直到在某个时间点,A 意外停止向B 发送请求,由于超时(5 秒)而失败并抛出此错误:

Error: Deadline Exceeded

这两个微服务都是 Docker 容器,在 AWS ECS 上运行并通过 AWS ELB(不是 ALB,因为它不支持 HTTP2 和其他一些问题)进行通信。

我尝试从 EC2 实例和正在运行的 ECS 任务(Docker 容器本身)本身运行 telnetAB 的 ELB,它连接良好,但仍然是 NodeJS A 中的应用程序无法使用 gRPC 连接访问 B 中的 NodeJS 应用程序。

唯一的解决方法是停止并启动ECS任务,然后A成功再次连接到B(直到下一次意外再次出现相同的场景),但这当然不是解决方案.

有人遇到过这种问题吗?

【问题讨论】:

这个问题的结论是什么?您(以及如何)解决了吗?我目前遇到同样的问题。一个一元 grpc 调用的 Deadling 超过了,然后在那之后的每一个调用都开始失败? 遇到同样的问题,有什么解决办法吗? 【参考方案1】:

您使用一元 API 还是流式 API?你有没有设定最后期限? gRPC 截止日期是每个流的,因此在设置 X 毫秒截止日期时进行流式传输,您将在 打开 流后获得 DEADLINE_EXCEEDED X 毫秒(不发送或接收任何消息!)。而且您将永远为这个流获取它,摆脱它的唯一方法是重新打开一个流。

【讨论】:

我们同时使用一元(用于单个模型)和流式传输(用于集合),但我提到的错误是针对一元接收的。【参考方案2】:

我发现我需要创建一个新的存根,还需要在出现一些错误后重新创建连接以使其重新连接。 (也在ECS中运行)

【讨论】:

以上是关于gRPC DEADLINE_EXCEEDED 即使服务器已启动并且的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 插入请求的 DEADLINE_EXCEEDED 异常

即使使用负载平衡器地址,gRPC 客户端也不使用 grpc-lb

即使已安装 CMake 也无法找到 gRPC 库(mac)

如何在 gRPC 响应中打印所有 protobuf 字段,即使是空的

当 Compute Engine 外部 IP 地址设置为无时发布/订阅 DEADLINE_EXCEEDED

从 Compute Engine 发布到 Cloud Pub/Sub 主题时的 DEADLINE_EXCEEDED