d := 800 * time.Millisecond
ctx, cancel := context.WithTimeout(ctx, d)
defer cancel()
grpcurl -max-time 1 -d '{}' host:9090 svc.Method

客户端报 DEADLINE_EXCEEDED,服务端日志显示这个请求处理只用了 200ms,两边时间对不上,重试一次又完全正常,很像是时间被谁截断了。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:客户端把剩余超时当成绝对时间往下传,上游 deadline 已经过去大半,请求排队之后就超了,后面执行再快也来不及,日志里只看到超时。

这次卡住的地方就在「gRPC 截止时间」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:检查每一层是不是把剩余时间往下传,而不是重新计算;给下游留出的 deadline 必须比上游更短,别做成等长传递;在入口先打一个点,看看排队耗时到底占了多少比例。

确认没问题再收工,服务端耗时与客户端 deadline 对得上,不再出现处理很快却超时,两边日志能对上。

作者 9823189