我正在从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
如果我理解正确,则将截止日期设置为时间: 09.153 之后的1秒06:30: 09.153 ,这实际上意味着带有存根的呼叫应在之后失败 10.153 。在此注册时间之前抛出了异常。
有人可以解释这种行为吗?
答案 0 :(得分:0)
我希望问题在于,日志时间是从不同于截止日期的时间测量的。即,“ ns”是在记录器检索当前时间之前计算的。
这在新的Java流程中尤其明显,因为类加载和Java的慢速解释器意味着您可以看到期望的快速代码之间有相当长的一段时间。如果系统由于交换或平均负载过高而崩溃,也有可能。