Grpc传输大数据,一元调用比流式传输慢,

时间:2020-10-18 13:16:13

标签: c# .net grpc

我正在尝试使用grpc在两个服务之间传输大数据。

数据大小约为23M,由42个大列表组成。

然后,我使用一个一元调用与服务器端流(一次流一个列表)测试性能。

一元电话需要276.59毫秒。

流式通话需要126.64毫秒。

但是如果我将数据更改为包含1000个小列表,每个列表只有一个数字,则流式调用比一元调用要慢得多。

结果正常吗?为什么?

这是服务器端代码:

public override Task<MemDtoToWbs> GetLargeMEM(Empty request, ServerCallContext context)
{
    return Task.FromResult(MemData.GrpcLargeMem);
}
public override async Task StreamLargeMem(Empty request, IServerStreamWriter<LogDtoToWbs> responseStream, ServerCallContext context)
{
    foreach (var log in MemData.GrpcLargeMem.Logs)
    {
         await responseStream.WriteAsync(log);
    }
}

我使用.net core 3.1和grpc nuget软件包2.32.0。 在aks集群中运行测试。

谢谢。

1 个答案:

答案 0 :(得分:0)

我认为@Jan Tattermusch是正确的。

我在localhost中测试,TCP段大小为64K。 当小消息太小时(例如32K),每个TCP段中的有效载荷长度只有6.5K。但是,如果消息很大,则可以使用所有64K。因此,是的,发送每条消息的开销可能会加起来,事情最终会变慢。

因此,对于我来说,如果消息很大,流式传输会更快,这是合理的。 因为在服务器端发送数据和在客户端处理数据是并行运行的。

enter image description here