protobuf协议

简介

protobuf 是google开发的一种数据描述语言,能够将结构化数据序列化,可用于数据存储、通讯协议等方面,可以把它理解为更快、更简单、更小的xml或者json,区别在于protobuf是二进制格式,xml、json是文本格式,它的序列化和反序列化的效率比xml、json高的多。

bytes对比

在这里插入图片描述

响应时间

在这里插入图片描述

基本原理

1.基于128bits的数值存储方式

每个字节最高位标识本块数据是否结束(1:未结束,0:结束),低7位表示数据内容。
数字300的表示方法为:1010 1100 0000 0010,protobuf字节序是小端字节序,所以这个数字实际是0000 0010 1010 1100:

1010 1100 0000 0010
→ 010 1100 000 0010
如下:
000 0010 010 1100
→ 000 0010 ++ 010 1100
→ 10 0101100
→ 256 + 32 + 8 + 4 = 300

2.基于序号的协议字段映射

message person{
required string name = 1;
required string country = 2;
optional int32 age = 3;
}
效果相当于json数据:person = [{1: “john”}, {2: “USA”}, {3: 30}],其中{3: 30} 还可以不传,person还可以传成 [{2: “USA”}, {1: “john”}],对端仍旧可以正常解析。

3.协议数据结构

每块数据前加一个数据头,表示数据类型及协议字段序号。
msg1_head + msg1 + msg2_head + msg2 + …
数据头示例:
0000 1000
低3位表示数据类型:0,其他表示协议字段序号:1

protobuf的优缺点

优点:
1、体积小:消息大小只需要XML的1/10 ~ 1/3;
2、速度快:解析速度比XML快20 ~ 100倍;
3、使用Protocol Buffers的编译器,可以生成更容易在编程中使用的数据访问代码;
4、字段可以乱序,欠缺,因此可以用来兼容旧的协议,或者是减少协议数据;更好的兼容性,Protocol Buffers设计的一个原则就是要能够很好的支持向下或向上兼容。

但是字段允许乱序欠缺,反过来也是缺点。所以这里总结 protobuf 两个缺点,一个跟这有关:

1、如果字段过多,或者嵌套过深,都会影响反序列化效率,解析每一块数据都要根据序号找到对应的位置然后再插入到已解析好的数据中。

2、数据基于128bits的存储方式,单块数据比较大时效率很受影响。解析数据需要取到所有字节的低7位,然后再拼成一整块数据。

以上两个缺点,特别是对于erlang这类没有指针的语言来说,代价就相当昂贵。

3、协议序号也要占空间,序号越大占空间越大,当序号小于16时无需额外增加字节就可以表示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值