在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都为您提供了。
- 用深度学习硬件的闲置时间,来挖比特币
- 深度学习:如何理解tensorflow文本蕴含的原理
- 重磅!腾讯与科大讯飞技术共创,Google ProtoBuf进入TARS家族!
- 深度学习与R语言
- 在Keras中展示深度学习模式的训练历史记录
- 分析漏洞利用工具包 Archie和Astrum工具包
- 手游热更新方案xLua开源:Unity3D下Lua编程解决方案
- 如何为Keras中的深度学习模型建立Checkpoint
- Dubbo 源码解析 —— Zookeeper 创建节点
- 熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker
- 源码级别解读 mybatis 插件
- 在WebKit中并行加载外部脚本译:
- 100行代码,搞定http监控框架
- 【腾讯反病毒实验室】深度剖析APT28最新作品
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Pwnhub Web题Classroom题解与分析
- WTForm的URLXSS谈开源组件的安全性
- 谈一谈复杂的正则表达式分析
- Linux 用户名、主机添加背景色
- percona-toolkit大表操作DDL使用 2.1. 数据库字符集修改2.2. 数据库建库、授权操作2.3. 数据库建表、插入数据4.1. 添加表字段【
- PHPMailer 代码执行漏洞(CVE-2016-10033)分析(含通用POC)
- linux 平均负载 load average 的含义【转】
- zookeeper-01 概述
- zookeeper-02 部署
- zookeeper-03 命令行操作
- java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for ...”
- Linux 内存使用率
- CentOS7.4下编译Hadoop-2.7.6
- VMware安装CentOS6
- VMware安装CentOS7 3.1 主机名修改3.2 网卡名修改3.3 ifconfig安装