在Go中对gRPC+ProtoBuf与Http+Json进行基准测试

时间:2022-06-11
本文章向大家介绍在Go中对gRPC+ProtoBuf与Http+Json进行基准测试,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本文为译文 作者: ALEX PLIUTAU 原文地址: http://pliutau.com/benchmark-grpc-protobuf-vs-http-json/

服务之间通信的最简单的解决方案是使用JSON over HTTP。尽管JSON具有许多明显的优点(比如它具有很好的可读性,易于理解,且通常性能良好),但它还是有一些问题的。在局域网内的数据交互,Google的Protocal Buffer这种结构编码是比JSON更好的选择。

gRPC默认使用protobuf,它更快,因为它是二进制的且是类型安全的。我编写了一个演示项目,使用JSON over HTTP与使用gRPC API的方式进行了一次基准测试。

该库包含2个相同的API:基于Protobuf的gRPC和JSON over HTTP。目的是进行两种方式的基准测试,并对结果进行比较。API只包含一个创建用户的接口,请求(Request)的过程包含验证的步骤。在2种方式的程序中,请求、验证和响应这几个步骤都是相同的,所以我们只是测试整个响应过程。当然,基准测试还包括响应解析。

我使用Go 1.9,结果表明,gRPC性能是JSON over HTTP的10倍:

BenchmarkGRPCProtobuf-8          10000        197919 ns/op
BenchmarkJSONHTTP-8               1000       1720124 ns/op

CPU使用情况比较

重新启动应用程序,我使用性能测试工具pprof对API服务器进行了30秒的请求,命令行如下:

go tool pprof http://localhost:6060/debug/pprof/profile
go tool pprof http://localhost:6061/debug/pprof/profile

我每次运行pprof后使用top中查看CPU使用情况,结果显示,Protobuf的资源消耗较少,是Http消耗资源的的70%。

自己测试一下

如果要自己测试,可以复制此库https://github.com/plutov/benchmark-grpc-protobuf-vs-http-json的代码并运行:

glide i
go run grpc/main.go
go run json/main.go
go test -bench=.

结论

很明显,在内部网络通讯时最好是使用gRPC,客户端调用将更加简洁,您不必担心数据的序列与反序列化,因为这些gRPC都为您提供了。