我有两个通过
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
(直到下一个意外的时间重现相同的场景),但这当然不是解决方案。
有人遇到过这样的问题吗?
你使用一元API还是流式API?你设定任何期限吗? gRPC 截止时间是针对每个流的,因此在设置 X 毫秒截止时间时进行流式传输时,您将在打开流后收到 DEADLINE_EXCEEDED X 毫秒(不发送或接收任何消息!)。并且您将永远为此流获取它,摆脱它的唯一方法是重新打开流。
我发现我需要创建一个新的存根,而且在出现一些错误后重新创建连接才能使其重新连接。 (也在ECS中运行)