gRPC 截止时间设置和调用超时差低于截止时间

gRPC deadline set and call timeout difference lower than deadline time

提问人:uzumas 提问时间:6/14/2019 更新时间:6/25/2019 访问量:2142

问:

我正在从 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.153 之后的 1 秒内设置的,实际上意味着带有存根的调用应该在 10.153 之后失败。异常是在此注册时间之前抛出的。

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

Java Go gRPC 截止日期

评论

0赞 Victor Gubin 6/14/2019
似乎是网络问题,您服务和检查的 ping/traceroute 已启动并运行。还要检查防火墙是否未阻止服务端口上的网络连接。

答:

1赞 Eric Anderson 6/25/2019 #1

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

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