Почему крайний срок gRPC, полученный на сервере, отличается от срока, отправленного клиентом

Я использую реализацию gRPC csharp, чтобы две службы могли общаться друг с другом.

Когда звоню от клиента, я устанавливаю Крайний срок. Получая звонок на сервер, я читаю, каков крайний срок. К моему удивлению, значение дедлайна не то же самое, отличается на доли секунды.

В документах gRPC говорится, что Крайний срок - это фиксированный момент времени. Поэтому я ожидал бы получить такое же значение на сервере, но это не так.

Я вижу, что в нем упоминалось об округлении 100нс, но в моем случае это намного больше.

Может ли это учитывать время полета? Я не могу найти такой логики, и это нарушило бы понятие фиксированной точки во времени.

Есть ли ошибка при преобразовании между внутренним Timespec gRPC и c # DateTime в исходный код gRPC?

Пример (псевдо) кода:

// 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 для сервера


person Alvis    schedule 22.09.2020    source источник


Ответы (1)


Библиотека gRPC работает должным образом. Находясь локально на сервере / клиенте, время истечения срока действия RPC выражается как крайний срок, при отправке RPC по сети метка времени внутренне преобразуется в тайм-аут (а затем преобразуется обратно в крайний срок после получения одноранговым узлом). Это необходимо для корректировки рассогласования часов между клиентом и сервером (в противном случае, если время на сервере немного отклоняется, это будет мешать ожидаемому истечению RPC).

См. https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md, чтобы узнать, что передается по сети (ищите таймаут).

person Jan Tattermusch    schedule 06.10.2020