前言:tim是去中心化的分布式im引擎。 传输协议是tim能架设支持百亿级别在线用户量的重要因素,tim的协议在协议包体积与协议序列化反序列化方面,都有非常优秀的表现。
来源《tim实践系列》

tim协议支持两种格式,thrift 压缩格式与json格式;主要支持的协议使用gothrift进行序列化与反序列化.

测试数据与长度

字段名数据长度(字节)
MsType11
OdType11
Id1<<608
Mid1<<618
BnType1<<304
FromTidTidBean{Node: "tom"}3
ToTidTidBean{Node: "jerry"}5
Body[]byte("A good programmer")17
IsOfflinetrue1
Timestamp1<<608
Extendmap[string]string{"ex1": "A good programmer", "ex2": "A good programmer"}40

原始输入数据的总长度为96字节,各个框架序列化后数据长度:

序列化后数据长度体积
Msgpack254 字节较大
Json366 字节
Thrift124 字节
ProtoBuf125字节

序列化反序列化 压测结果

1.串行压测结果

序列化框架运行数效率(纳秒/次)分配内存内存分配次数
MsgpackEncode-48831001411 ns/op616 B/op8 allocs/op
MsgpackEncode-88881981400 ns/op616 B/op8 allocs/op
jsonEncode-47415681622 ns/op712 B/op9 allocs/op
jsonEncode-87030321694 ns/op712 B/op9 allocs/op
ThriftEncode-49805031167 ns/op456 B/op7 allocs/op
ThriftEncode-810286181186 ns/op456 B/op7 allocs/op
ProtoBufEncode-49979201234 ns/op256 B/op9 allocs/op
ProtoBufEncode-810000001234 ns/op256 B/op9 allocs/op
反序列化框架运行数效率(纳秒/次)分配内存内存分配次数
MsgpackDecode-45260422206 ns/op432 B/op28 allocs/op
MsgpackDecode-85159012192 ns/op432 B/op28 allocs/op
jsonDecode-42202325560ns/op536 B/op22 allocs/op
jsonDecode-82154975564ns/op536 B/op22 allocs/op
ThriftDecode-48795061449 ns/op912 B/op22 allocs/op
ThriftDecode-87735591548 ns/op912 B/op22 allocs/op
ProtoBufDecode-46969971669 ns/op928 B/op29 allocs/op
ProtoBufDecode-86969361737 ns/op928 B/op29 allocs/op

压测结果比较:

序列化框架序列化效率反序列化效率
Msgpack1400 ns/op2206 ns/op
Json1622 ns/op5560 ns/op
Thrift1167 ns/op很快1449 ns/op很快
ProtoBuf1234 ns/op很快1669 ns/op很快

2.并行压测结果

序列化框架运行数效率(纳秒/次)分配内存内存分配次数
MsgpackEncode-42258724492.1 ns/op616 B/op8 allocs/op
MsgpackEncode-82138186557.9 ns/op616 B/op8 allocs/op
jsonEncode-42028855582.4 ns/op712 B/op9 allocs/op
jsonEncode-81777850686.1 ns/op712 B/op9 allocs/op
ThriftEncode-42622094456.3 ns/op456 B/op7 allocs/op
ThriftEncode-82328318518.0 ns/op456 B/op7 allocs/op
ProtoBufEncode-41745168624.9 ns/op256 B/op9 allocs/op
ProtoBufEncode-81854494652.8 ns/op256 B/op9 allocs/op
反序列化框架运行数效率(纳秒/次)分配内存内存分配次数
MsgpackDecode-41230190944.8 ns/op1015 B/op34 allocs/op
MsgpackDecode-810000001159ns/op1015 B/op34 allocs/op
jsonDecode-45784042079 ns/op1096 B/op27 allocs/op
jsonDecode-85950422381 ns/op1096 B/op27 allocs/op
ThriftDecode-41905132756.4 ns/op912 B/op22 allocs/op
ThriftDecode-810000001103 ns/op912 B/op22 allocs/op
ProtoBufDecode-41287536906.7 ns/op928 B/op29 allocs/op
ProtoBufDecode-810000001042 ns/op928 B/op29 allocs/op

压测结果比较:

序列化效率反序列化效率
Msgpack492.1 ns/op很快944.8 ns/op
Json582.4 ns/op2079 ns/op
Thrift456.3 ns/op很快756.4 ns/op很快
ProtoBuf624.9 ns/op906.7 ns/op

结论

tim的通讯协议主要数据类型是:数字,字节数组,字典,字符串

thrift与protobuf的数据压缩后体积相差无几,如果去掉字典类型,protobuf<thrift ,也是相差几个字节,它们都使用zagzig实现整数变长编码,protobuf的数字类型序列化效率更高。

由协议序列化的测试结果可以看出,在可能的条件下,应避免使用json协议,json协议的数据包体积与序列化效果都比较差。

说明:这个测试只是特定数据类型下的测试结果。并非说thrift的序列化性能高于protobuf。比如序列化数字类型,protobuf的序列化效率要高于thrift。这是针对tim所需的数据类型。

tim的序列化反序列化使用gothrift,具体可以参考文章 《gothrift 一 go版thrift性能优化项目》

比较有代表性的框架的序列化效果与性能在测试数据中已经详细说明,tim的序列化性能会在gothrift项目中继续进行优化改进。

tim支持在thrift与json之间的协议相互通信与转换,所以,基本所有图灵完备的编程语言都可以实现tim的客户端并接入tim服务进行通信。

测试程序源码及测试结果


有任何问题或建议请Email:donnie4w@gmail.comhttps://tlnet.top/contact 发信给我,谢谢!


donnie4w
6 声望0 粉丝

Github:[链接]