-
近期启动RPC框架的对比研究,主要计划分析下dobbox(当当出品)、motan(新浪出品)、Apache Thrift(Facebook出品,文档支撑不行业界说Facebook是只管拉不管擦屁股)、ProtoBuffer(gRPC-google出品必是精品、支撑文档十分详细)的框架性能,功能及适合场景进行研究,研究初发现RPC毕竟是做client跟server端数据请求及接受,那么序列化这块也占比性能的很大一个比重,故想对RPC的序列化先主流分析一把。
由于之前对xml解析(序列化有过一定分析参考:http://3ms.huawei.com/km/blogs/details/2637475 )故本次xml的序列化中只采用了产品广泛使用的xstream Libarary作代表,json类序列化采用知名度很高的Jackson、二进制序列化类中主流3种(ProtoBuffer、Thrift、Avro)由于三者中Thrift和Avro还可以是独立的RPC框架,故会重点作为研究对象。
目前Avro数据还在调测中,其中ProtoStuff是来充数的,它其实是protobuffer的java版增强版,可以不用写.proto文件,易用性好,性能及各种数据跟protobuffer接近,缺点是只支持java.
对象构造参考:http://www.cnblogs.com/xiaoMzjm/p/4555209.html
测试构造javabean:使用的JavaBean所拥有的字段类型相同、字段数量相同(约28个)、字段所附的值相同、都包含有一个List<String>字段,用List字段的size来控制JavaBean对象的大小。本次测试中size=100。参加附件Product.java
Protobuffer的IDL文件是product.proto, 如何转换成类有两种方法,一种直接安装Protobuffer,用命令行处理,另一种使用插件处理,插件部分pom配置很关键,折腾很久这块留其他地方写下。参考:
http://www.cnblogs.com/ghj1976/p/5391205.html 及3种方法使用Maven插件整合protocol buffer:http://blog.csdn.net/qq_27273089/article/details/70230897
Thrift的IDL文件是product.thrift,如何转换请参考:http://blog.csdn.net/liubenlong007/article/details/54692467
本次仅仅测试了100、1000、10000个对象对比,10万 20万,只是改下数字有兴趣的可以试试
CPU占用情况及内存占用情况,待补充,因为启动jconsle有点费劲。
按道理说Thrift的TbinaryProtocal跟TcompactProtocal对比应该有差距,不过我实际上的测试基本接近
序列化耗时(ms) 100个对象 1000个对象 10000个对象 xstreamLibrary 1057 1251 3121 protostuff 212 244 340 protobuffer 65 169 284 Jackson(json序列化) 650 692 768 Apache Thrift(TBinary) 88 105 367 Apache Thrift(TCompact) 83 103 338 反序列化耗时ms 100 1000 10000 xstreamLibrary 373 1420 3121 protostuff 41 83 278 protobuffer 31 94 320 Jackson(json反序列化) 164 246 853 Apache Thrift(TBinary) 33 61 783 Apache Thrift(TComapct) 30 60 885 序列化文件大小KB 100 1000 10000 xstreamLibrary 296 2953 29522 protostuff 2 11 107 protobuffer 2 11 107 Jackson(json序列化) 93 926 9258 Apache Thrift(TBinary) 2 11 107 Apache Thrift(TCompact) 2 11 107 -
内存情况后续补上,可以先参考网上结论
总结:
xml序列化性能较差,且生成文件较大,对于性能要求不高的,且可读性要求较高的场景考虑
jackson作为使用度及广泛且社区十分活跃的java jsonlib库,且支持xml格式,是跨平台的相对可读性较好的轻量级序列化工具\对于web端使用及广泛.
如果系统对序列化性能要求极高,且用于大数据传输需要考虑序列化文件大小时,使用Protobuffer、Apache Thrift相对比较合适。
二者还支持多语言,其中Apache Thrift可支持的语言多于protobuffer,且Thrift实现了完整的客户端和服务端堆载,可以快速实现RPC,功能上完爆protobuffer,只是支持文档不够完善。
Apache Thrift VS protobuffer VS Avro参考:http://www.cnblogs.com/fxjwind/archive/2013/05/16/3082219.html
protostuff Vs protobuffer:protostuff在基本不耗费性能的情况下实现了不需要编写.proto文件的直接把pojo序列化的能力,使用十分简单,对于有大量pojo不想重写.proto文件的java工程使用protostuff是学习成本很低,且性能较高的解决途径,不过局限在仅仅支持java,如果客户端可能是C+\python等,还是考虑protobuffer吧
google出品的protobuffer活跃度很高,文档也很完善,是序列化不错选择,但是对于微服务很重视的RPC框架来说,选择Protobuffer还是Thrift还是Avro还是有区别的,PB还不算一个完整的RPC框架,Thrift已经是很完善的RPC了,能够快速构造RPC,且支持语言多与PB,关于三者的比较参考:http://blog.csdn.net/bitcarmanlee/article/details/53367892
关于Avro的数据后续补充
转载于:https://my.oschina.net/u/1998081/blog/1570614