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

问题描述 投票:0回答:2

我有两个通过

gRPC
相互通信的微服务,
A
是 RPC 客户端,
B
是 RPC 服务器,两者都是使用 grpc NPM 模块用 NodeJS 编写的。

一切都工作正常,直到在某个时间点,意外地

A
停止向
B
发送请求,由于超时(5秒)而失败并抛出此错误:

Error: Deadline Exceeded

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

我尝试从 EC2 实例和正在运行的 ECS 任务(Docker 容器本身)本身运行

telnet
A
B
的 ELB,并且它连接良好,但仍然是 NodeJS 应用程序
A
无法使用 gRPC 连接到达
B
中的 NodeJS 应用程序。

解决这个问题的唯一办法就是停止并启动ECS任务,然后

A
再次成功连接到
B
(直到下一个意外的时间重现相同的场景),但这当然不是解决方案。

有人遇到过这样的问题吗?

node.js amazon-web-services docker rpc grpc
2个回答
0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.