【问题标题】:Why does a gRPC deadline received on a server differs from the one sent by a client为什么服务器上收到的 gRPC 截止日期与客户端发送的截止日期不同
【发布时间】:2020-10-06 20:33:06
【问题描述】:

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

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

gRPC 文档说截止日期是fixed point in time。所以我希望在服务器上收到相同的值,但事实并非如此。

我可以看到它提到了100ns 的四舍五入,但就我而言,它更多。

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

在 gRPC 内部 TimespecgRPC source code 中的 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 用于服务器

【问题讨论】:

    标签: .net grpc grpc-dotnet


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 2012-11-16
      相关资源
      最近更新 更多