系统性能调优必知必会
陶辉
智链达 CTO,前阿里云 P8 高级技术专家
36367 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
系统性能调优必知必会
15
15
1.0x
00:00/00:00
登录|注册

17 | Protobuf是如何进一步提高编码效率的?

使用打包功能提升编码效率
enum枚举类型压缩空间
数字的编码规则
字符串用Length-delimited方式编码
6种不同的编码方式
1到5个字节表示字段名
字段名预分配数字
应用程序自行完成字段名映射关系
静态表与动态表
性能测试报告中的arenas功能
gRPC结合了HTTP/2与Protobuf的优点
保持高空间利用率的前提下,Protobuf拥有快速速度
字段值编码
字段名编码
gRPC将Protobuf作为底层的编解码协议
编码后的字符流体积小于JSON等格式
编码速度快,消耗的CPU计算力少
面向多种平台和编程语言
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
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • Ken
    gRPC基于Http2可以复用http2带来的新特性,比如双向流,单连接多路复用,头部压缩(hpack)。protobuf解决的是body的序列化空间效率,hpack解决的是header的空间效率,两者不冲突。

    作者回复: 完全正确!

    2020-06-12
    2
    39
  • 冬风向左吹
    wireshark支持protobuf协议插件:https://code.google.com/archive/p/protobuf-wireshark/downloads

    作者回复: 赞!谢谢东郭的分享!

    2020-06-15
    3
    9
  • 安排
    protobuf需要通信双方提前约定好proto文件,这是一个限制,限制了它的使用场景。而http2没有这个要求,是一种更通用的设计,只要符合规范,就可以通信。

    作者回复: 是的

    2020-06-12
    9
  • 妥协
    protobuf是按照字段名,字段类型和字段值编码。如果传输的是表格数据,就是第一行是多个字段,后面的多行都是字段值,这种情况下,字段名和字段类型只在第一行时传输,后面的多行字段值记录就不用传输了,这种效率是不是更高些?我们公司的自定义协议应该就是这种

    作者回复: 是的,表格其实就是二维数组,你可以通过protobuf中数组的packed功能,实现同样的效果。

    2020-06-29
    4
  • 饭团
    老师,请问红色和蓝色位为保留位,请问蓝色是出于什么目的?

    作者回复: 你好饭团,你是说整数编码吗?由于1个整数数值越小,可以用更少的字节表示,而越大则使用更多的字节表示,所以红色的首bit位用于表示这是否为最后1个字节。 蓝色保留位没明白什么意思。

    2020-06-12
    3
  • butterfly
    一直有个疑问: 服务器端和客户端的两端都定义了.proto文件, 两端应该都是可以知道某个字段名字和值类型的。 如果只传输 字段的 顺序 和 值(字段名字和类型都不传输),数据传到对端的时候, 再解码出来. 为什么不能这样做呢?

    作者回复: 实际就是像你说的这样做的,传递的只是字段的序号(为了提升灵活性,序号未必只能从1递增,可以任意指定)!

    2021-03-22
    1
  • Geek_78d3bb
    json简化了xml,protobuffer又优化了json 的key部分,双方都在proto中定义了key,所以只传序号查proto就知道是什么key了

    作者回复: 是的。proto对整数、数组的编码,以及编解码的速度都非常好。

    2020-10-22
    1
  • 那时刻
    参考这里https://developers.google.com/protocol-buffers/docs/reference/arenas,学习了下protobuf对于arenas的介绍。 arena相当于内存池的概念,预先分配一块大内存,当protobuf操作消息对象需要分配内存的时候,去arenas来取,使用完之后放回到arena里。 这种做法的优势在于,1,加速内存分配和释放。2,有效利用cache line。 3,减少CPU时间
    2020-06-12
    5
  • test
    protobuf对body进行压缩,http2对header进行压缩。 http2还可以使用stream方式传输,这些都是protobuf没有的。
    2020-06-12
    4
  • 寻己
    听懂了60,70%吧,谢谢
    2024-03-08归属地:广东
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部