【问题标题】:How to solve grpc Deadline Exceeded error?grpc Deadline Exceeded错误如何解决?
【发布时间】:2017-08-15 20:08:02
【问题描述】:

我有一个 go 编写的 grpc 服务器和一个 python 客户端,有时会出现以下错误:

eggs/grpcio-1.0.0-py2.7-linux-x86_64.egg/grpc/_channel.py\", line 432, in _end_unary_response_blocking\n    raise _Rendezvous(state, None, None, deadline)\nInternalServerError: Deadline Exceeded\n"}

grpc Deadlines concept

gRPC 允许客户端在调用远程时指定截止时间值 方法。这指定客户端想要等待多长时间 在 RPC 以错误结束之前来自服务器的响应 DEADLINE_EXCEEDED。在服务器端,服务器可以查询 查看特定方法是否超时的截止日期,或多少时间 剩下来完成方法。

如何指定截止日期因语言而异 - 对于 例如,在 Python 中总是需要截止日期值,而不是全部 语言有默认截止日期。

有没有办法解决这个错误?

【问题讨论】:

  • 客户端和服务端都写了吗?代码看起来如何?服务器如何处理超时?客户端如何处理超时?
  • 当你问“有没有办法解决这个错误?”时,你还没有提出这个错误需要解决的情况。 gRPC 告诉你 RPC 在你允许它完成的时间内没有完成 - 好吧,你希望你的代码接下来做什么?重试吗?尝试不同的 RPC?向代码的用户报告错误?另外,Python 不再总是需要截止日期。我会努力更新该文档。
  • @NathanielManistaAtGoogle 感谢您的提醒,我想我应该详细描述一下这个案例。我想知道为什么RPC无法在截止日期前完成,是消息流的大小太大还是网络问题?我可以更改截止日期吗?我没有找到任何文件来解释它。
  • 使用 gRPC Python 调用 RPC 时,不传递超时值意味着“无超时”或“无限超时”。导致 RPC 超时的原因是......几乎任何你能想象到的事情,但通常客户端上的一些问题干扰了在分配的时间内正在处理的 RPC,服务器上的一些问题干扰了在分配的时间内正在处理的 RPC,或者网络上的一些问题在两者之间交换字节。你能控制你的服务器吗?您是否观察到您的服务器及时完成了 RPC?

标签: python go protocol-buffers rpc grpc


【解决方案1】:

正如上面评论中提到的,截止日期可以是客户端和服务器之间的任何东西,包括网络和服务器的实现。当您通过网络交谈时,有时应该预计到最后期限,例如在包裹丢失期间。一般而言,您可以在这里执行以下操作:

  • 优化服务器实现以更快地处理您的请求。
  • 如果客户设置了较短的截止日期,请增加此截止日期。
  • 通过以下方式优雅地处理截止日期错误:
    • 正在重试。只要确保使用指数回退,就不会在服务器过载情况下使问题变得更糟。
    • 向上报告错误。
    • 有时也可以回退到不使用该 grpc 调用并降低体验。

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 2020-02-07
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多