繁体   English   中英

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

[英]Grpc transfer big data, one unary call is slower than streaming,

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

数据大小约23M,由42个大List组成。

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

一元调用需要 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 集群中运行测试。

谢谢。

我认为@Jan Tattermusch 是对的。

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

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

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM