17 | Protobuf是如何进一步提高编码效率的?
陶辉
该思维导图由 AI 生成,仅供参考
你好,我是陶辉。
上一讲介绍的 HTTP/2 协议在编码上拥有非常高的空间利用率,这一讲我们看看,相比其中的 HPACK 编码技术,Protobuf 又是通过哪些新招式进一步提升编码效率的。
Google 在 2008 年推出的 Protobuf,是一个针对具体编程语言的编解码工具。它面向 Windows、Linux 等多种平台,也支持 Java、Python、Golang、C++、Javascript 等多种面向对象编程语言。使用 Protobuf 编码消息速度很快,消耗的 CPU 计算力也不多,而且编码后的字符流体积远远小于 JSON 等格式,能够大量节约昂贵的带宽,因此 gRPC 也把 Protobuf 作为底层的编解码协议。
然而,很多同学并不清楚 Protobuf 到底是怎样做到这一点的。这样,当你希望通过更换通讯协议这个高成本手段,提升整个分布式系统的性能时,面对可供选择的众多通讯协议,仅凭第三方的性能测试报告,你仍将难以作出抉择。
而且,面对分布式系统中的疑难杂症,往往需要通过分析抓取到的网络报文,确定到底是哪个组件出现了问题。可是由于 Protobuf 编码太过紧凑,即使对照着 Proto 消息格式文件,在不清楚编码逻辑时,你也很难解析出消息内容。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Protobuf是一种高效的编解码工具,能够大幅提升编码效率。相比于传统的JSON等格式,Protobuf编码后的字符流体积远远小,能够节约昂贵的带宽。它通过为每个字段预分配一个数字来编码消息,省去了完整字段名占用的空间,实现了高空间利用率。此外,Protobuf还采用了多种高效的编码方式,如对不同类型的值采用不同的编码方式,以及通过enum枚举类型压缩空间等。另外,对于拥有默认值的字段,Protobuf编码时会略过它,而对于repeated列表,使用打包功能可以带来可观的空间收益。总的来说,Protobuf在保持高空间利用率的前提下,拥有飞快的编解码速度。这些特点使得Protobuf成为gRPC协议的底层编解码协议,结合了HTTP/2与Protobuf的优点,在应用层提供方便而高效的RPC远程调用协议。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《系统性能调优必知必会》,新⼈⾸单¥59
《系统性能调优必知必会》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(12)
- 最新
- 精选
- KengRPC基于Http2可以复用http2带来的新特性,比如双向流,单连接多路复用,头部压缩(hpack)。protobuf解决的是body的序列化空间效率,hpack解决的是header的空间效率,两者不冲突。
作者回复: 完全正确!
2020-06-12239 - 冬风向左吹wireshark支持protobuf协议插件:https://code.google.com/archive/p/protobuf-wireshark/downloads
作者回复: 赞!谢谢东郭的分享!
2020-06-1539 - 安排protobuf需要通信双方提前约定好proto文件,这是一个限制,限制了它的使用场景。而http2没有这个要求,是一种更通用的设计,只要符合规范,就可以通信。
作者回复: 是的
2020-06-129 - 妥协protobuf是按照字段名,字段类型和字段值编码。如果传输的是表格数据,就是第一行是多个字段,后面的多行都是字段值,这种情况下,字段名和字段类型只在第一行时传输,后面的多行字段值记录就不用传输了,这种效率是不是更高些?我们公司的自定义协议应该就是这种
作者回复: 是的,表格其实就是二维数组,你可以通过protobuf中数组的packed功能,实现同样的效果。
2020-06-294 - 饭团老师,请问红色和蓝色位为保留位,请问蓝色是出于什么目的?
作者回复: 你好饭团,你是说整数编码吗?由于1个整数数值越小,可以用更少的字节表示,而越大则使用更多的字节表示,所以红色的首bit位用于表示这是否为最后1个字节。 蓝色保留位没明白什么意思。
2020-06-123 - butterfly一直有个疑问: 服务器端和客户端的两端都定义了.proto文件, 两端应该都是可以知道某个字段名字和值类型的。 如果只传输 字段的 顺序 和 值(字段名字和类型都不传输),数据传到对端的时候, 再解码出来. 为什么不能这样做呢?
作者回复: 实际就是像你说的这样做的,传递的只是字段的序号(为了提升灵活性,序号未必只能从1递增,可以任意指定)!
2021-03-221 - Geek_78d3bbjson简化了xml,protobuffer又优化了json 的key部分,双方都在proto中定义了key,所以只传序号查proto就知道是什么key了
作者回复: 是的。proto对整数、数组的编码,以及编解码的速度都非常好。
2020-10-221 - 那时刻参考这里https://developers.google.com/protocol-buffers/docs/reference/arenas,学习了下protobuf对于arenas的介绍。 arena相当于内存池的概念,预先分配一块大内存,当protobuf操作消息对象需要分配内存的时候,去arenas来取,使用完之后放回到arena里。 这种做法的优势在于,1,加速内存分配和释放。2,有效利用cache line。 3,减少CPU时间2020-06-125
- testprotobuf对body进行压缩,http2对header进行压缩。 http2还可以使用stream方式传输,这些都是protobuf没有的。2020-06-124
- 寻己听懂了60,70%吧,谢谢2024-03-08归属地:广东
收起评论