我有两个微服务通过gRPC
相互通信,A
是RPC客户端,B
是RPC服务器,都是使用grpc NPM模块在NodeJS中编写的
一切正常,直到某个时间点,A
意外停止向B
发送请求,由于超时(5s)而失败并抛出此错误:
Error: Deadline Exceeded
两个微服务都是Docker容器,在AWS ECS上运行并通过AWS ELB进行通信(不是ALB,因为它不支持HTTP2和其他一些问题)。
我尝试从telnet
运行A
到B
的ELB,无论是来自EC2实例还是来自正在运行的ECS任务(Docker容器本身)本身,并且连接正常但是,A
中的NodeJS应用程序无法使用gRPC连接到达B
中的NodeJS应用程序。
解决它的唯一方法是停止并启动ECS任务,然后A
成功再次连接到B
(直到下一个意外时间再现相同的场景),但它&# 39;当然不是解决方案。
有人遇到过这类问题吗?
答案 0 :(得分:0)
您使用一元或流API吗?你设定截止日期吗? gRPC截止日期是按流,因此如果在设置X毫秒截止日期时进行流式传输,则在打开流(不发送或接收任何消息!)后的X毫秒内,您将获得DEADLINE_EXCEEDED。并且你将继续为这个流永久地获取它,摆脱它的唯一方法是重新打开流。
答案 1 :(得分:0)
我发现我既需要创建一个新的存根,也需要在出现一些错误之后重新创建连接,以便重新连接。 (也在ECS中运行)