【问题标题】:gRPC deadline set and call timeout difference lower than deadline timegRPC 截止时间设置和调用超时时间差低于截止时间
【发布时间】:2019-10-28 19:50:37
【问题描述】:

我正在从 java 服务进行 gRPC 调用,并使用 withDeadlineAfter(1000, TimeUnit.MILLISECONDS).callApi()

此调用在大多数情况下都会超时 (DEADLINE_EXCEEDED)。当我检查日志时,它看起来如下

2019-06-14 06:30:09.153 +0000 - [DEBUG] - from io.grpc.internal.ClientCallImpl - Call timeout set to '999861860' ns, due to context deadline. Explicit call timeout was not set.
2019-06-14 06:30:09.909 +0000 - [ERROR] - from application - [ epoch=1560493809909 req=1560493808679.df7ns.10.0.3.96 ] - EVENT_MIGRATION:Failed to create channel: io.grpc.StatusRuntimeException: DEADLINE_EXCEEDED: deadline exceeded after 999695013ns

如果我理解正确,截止日期设置在时间 06:30:09.15309.153 之后的 1 秒,实际上意味着带有存根的调用应该在之后失败10.153。异常在此注册时间之前被抛出。

有人可以解释一下这种行为吗?

【问题讨论】:

  • 似乎是网络问题,您服务的 ping/traceroute 和检查已启动并正在运行。还要检查您的防火墙是否没有阻止服务端口上的网络连接。

标签: java go grpc deadlines


【解决方案1】:

我预计问题是日志时间是从与截止时间不同的点测量的。也就是说,“ns”是在记录器检索当前时间之前计算出来的。

对于新的 Java 进程,这一点尤其明显,因为类加载和 Java 的慢速解释器意味着您可以看到您期望快速的代码之间存在相当长的时间段。如果系统由于交换或高负载平均值而抖动,也有可能。

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 2018-08-20
    • 2011-01-21
    • 2021-07-12
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多