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

Posted Golang语言社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Go中对gRPC+ProtoBuf与Http+Json进行基准测试相关的知识,希望对你有一定的参考价值。

文 | ALEX PLIUTAU
共 1415 字,阅读需 4 分钟

在Go中对gRPC+ProtoBuf与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都为您提供了。


以上是关于在Go中对gRPC+ProtoBuf与Http+Json进行基准测试的主要内容,如果未能解决你的问题,请参考以下文章

go使用grpc实现go与go,go与C#相互调用

gRPC 一定要使用 Protobuf 吗?

grpc,protoc, protoc-gen-go,rust

没有收到来自远程调用的错误,一直到超时 Go gRPC + micro + protobuf

gRPC双向数据流的交互控制(go语言实现)

go+protobuf+grpc+consul简单的服务发现模型