【问题标题】:gRPC DEADLINE_EXCEEDED even that the server is up andgRPC DEADLINE_EXCEEDED 即使服务器已启动并且
【发布时间】: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 超过了,然后在那之后的每一个调用都开始失败?
  • 遇到同样的问题,有什么解决办法吗?

标签: node.js amazon-web-services docker rpc grpc


【解决方案1】:

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多