2

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

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

4

1 回答 1

1

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

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

于 2019-06-24T20:32:00.053 回答