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 容器本身)本身运行 telnet
从 A
到 B
的 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
如何在 gRPC 响应中打印所有 protobuf 字段,即使是空的