0

我正在使用 gRPC csharp 实现来让两个服务相互通信。

从客户打来电话时,我正在设置截止日期。在服务器上接到电话时,我正在阅读截止日期。令我惊讶的是,截止日期值不一样,相差几分之一秒。

gRPC 文档说 Deadline 是一个固定的时间点。所以我希望在服务器上收到相同的值,但事实并非如此。

我可以看到它提到了100ns的舍入,但在我的情况下它更多。

可以考虑飞行时间吗?我找不到这样的逻辑,这将违反固定时间点的概念。

gRPC 源代码中的gRPC internalTimespec和 c#之间的转换是否存在错误?DateTime

示例(伪)代码:

// client:

var serviceClient = new ServiceClient(new Channel("address", "port", ChannelCredentials.Insecure));
var deadline = DateTime.UtcNow;
Console.WriteLine(deadline.ToString("O"));
serviceClient.SendAsync(request, new CallOptions(null, deadline));

// server:

public override async Task Send(SendRequest request, ServerCallContext context)
{
    Console.WriteLine(context.Deadline.ToString("O"));
}

控制台输出为:

2020-09-22T14:14:20.8359860Z为客户

2020-09-22T14:14:21.2910442Z用于服务器

4

1 回答 1

1

gRPC 库的行为符合预期。在本地服务器/客户端上,RPC 过期时间表示为截止日期,当在线发送 RPC 时,时间戳在内部转换为超时(然后在被对等方接收后转换回截止日期)。这对于调整客户端/服务器之间的时钟偏差是必要的(否则,如果服务器上的时间稍微偏离,它将与预期的 RPC 到期混淆)。

请参阅https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md了解在线传输的内容(查找“超时”)。

于 2020-10-06T12:33:06.497 回答