tim实践系列——tim协议与其他格式协议的比较


前言:tim是去中心化分布式即时通讯引擎。不依赖于任何中心服务器,采用去中心化分布式架构,解决传统中心化通讯方式的问题,去中心化分布式架构的通讯引擎的各个节点之间相互连接,形成一个庞大的分布式网络。可以轻松地扩展服务规模,支持更多的用户和业务需求,提供更加安全、可靠、高效的通讯服务。
Github系列开源文章
《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字节,各个框架序列化后数据长度:

序列化后数据长度体积
Msgpack 254 字节较大
Json    366 字节
Thrift  124 字节
ProtoBuf125字节



序列化反序列化 压测结果


1.串行压测结果

序列化框架运行数效率(纳秒/次)分配内存内存分配次数
MsgpackEncode-4883100 1411 ns/op 616 B/op8 allocs/op
MsgpackEncode-8888198 1400 ns/op616 B/op 8 allocs/op
jsonEncode-4741568 1622 ns/op 712 B/op 9 allocs/op
jsonEncode-8703032 1694 ns/op 712 B/op9 allocs/op
ThriftEncode-4980503 1167 ns/op456 B/op 7 allocs/op
ThriftEncode-81028618 1186 ns/op456 B/op 7 allocs/op
ProtoBufEncode-4997920 1234 ns/op256 B/op9 allocs/op
ProtoBufEncode-81000000 1234 ns/op256 B/op9 allocs/op


反序列化框架运行数效率(纳秒/次)分配内存内存分配次数
MsgpackDecode-4526042 2206 ns/op 432 B/op28 allocs/op
MsgpackDecode-85159012192 ns/op432 B/op 28 allocs/op
jsonDecode-42202325560ns/op 536 B/op 22 allocs/op
jsonDecode-82154975564ns/op 536 B/op22 allocs/op
ThriftDecode-48795061449 ns/op912 B/op 22 allocs/op
ThriftDecode-87735591548 ns/op912 B/op 22 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/op 616 B/op8 allocs/op
MsgpackEncode-82138186557.9 ns/op616 B/op 8 allocs/op
jsonEncode-42028855582.4 ns/op 712 B/op 9 allocs/op
jsonEncode-81777850686.1 ns/op 712 B/op9 allocs/op
ThriftEncode-42622094456.3 ns/op456 B/op 7 allocs/op
ThriftEncode-82328318518.0 ns/op456 B/op 7 allocs/op
ProtoBufEncode-41745168624.9 ns/op256 B/op9 allocs/op
ProtoBufEncode-81854494652.8 ns/op256 B/op9 allocs/op


反序列化框架运行数效率(纳秒/次)分配内存内存分配次数
MsgpackDecode-41230190944.8 ns/op 1015 B/op34 allocs/op
MsgpackDecode-810000001159 ns/op1015 B/op 34 allocs/op
jsonDecode-45784042079 ns/op 1096 B/op 27 allocs/op
jsonDecode-85950422381 ns/op 1096 B/op27 allocs/op
ThriftDecode-41905132756.4 ns/op912 B/op 22 allocs/op
ThriftDecode-810000001103 ns/op912 B/op 22 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/op      2079 ns/op
Thrift456.3 ns/op  很快756.4 ns/op 很快
ProtoBuf624.9 ns/op  906.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:[email protected]https://tlnet.top/contact  发信给我,谢谢!