ASP.NET Core gRPC性能比WebAPI还差?!(附解决方法)

最近项目上做服务间通信准备用gRPC,听说快,但是到底效果怎么样呢?

按照网上入门教程使用VS模板建了一个gRPC项目,不测不知道,居然比WebApi慢。

后来搜索到 RiccoYuan 的文章 .netcore - gRPC vs WebApi 耗时比较

他也提到gRPC比WebAPI还慢,不过他在测试中加入了按照官网教程创建的Console版本,这个版本倒是很快。

下面是他的测试结果(我也加入GrpcServiceConsoleApp,测试结果跟他一样)

最后 RiccoYuan 还在官方仓库提了个issue,不过官方直接说  it is still faster than JSON + WebAPI.  

技术图片

 

 

 后来我又看到了一位越南小哥 Thang Chung 的博客

Performance benchmark: gRPC vs. REST in .NET Core 3 Preview 8

张队的文章在此基础上升级到了.NET Core 3.1并进行了测试 

.NET Core 3.1 的REST 和gRPC 性能测试

得出结论:

当接口返回的数据量比较小时候,REST 的性能要比gRPC要好,当数据量变大之后gRPC的性能优势就比较明显了。 

我也下载了张队的代码进行了测试,结果一致。

 

为什么我测小数据量的时候,gRPC还是不如WebApi呢?!

我循环100次请求 结果如下:

技术图片

 

 经过对比代码我发现了差别:

我按照网上及微软官方教程创建的客户端代码:

var channel = GrpcChannel.ForAddress("https://localhost:5001");var client = new Greeter.GreeterClient(channel);

越南小哥的代码,也是上面提到gRPC官网的Console版本客户端代码(这个方法比上面快哦):

var channel = new Channel("127.0.0.1:5000", ChannelCredentials.Insecure); var client = new Greeter.GreeterClient(channel);

修改代码后再来,我多跑了几遍供大家参考,提升迅猛有木有:

技术图片

 

 上面的测试我是在循环内部创建Channel的,既然这么耗时,那我把最初的代码中的创建部分放到循环外部,果然跟我想的一样,性能好了很多:

从 RiccoYuan 测试结果的图片也能看出来这个问题。

技术图片

 

 

综上所述:创建Channel是关键(微软gRPC的介绍中也提到,如下图),还是采用gRPC官方的方式吧。

如果就想用微软的,尽量重用,避免频繁的创建操作。

技术图片

 

 

写在最后:我没去研究这两种创建方式到底差在哪里,有大神如果清楚也可以在下面留言,告诉我一下,谢谢啦。

 

相关文章