序列化软件选型对比:ProtoBuffer\Apache Thrift\Jackson\Xstream Library\ProtoStuff\Apache Avro

 

  • 近期启动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个对象
    xstreamLibrary105712513121
    protostuff212244340
    protobuffer65169284
    Jackson(json序列化)650692768
    Apache Thrift(TBinary)88105367
    Apache Thrift(TCompact)83103338

     

     

     

    反序列化耗时ms100100010000
    xstreamLibrary37314203121
    protostuff4183278
    protobuffer3194320
    Jackson(json反序列化)164246853
    Apache Thrift(TBinary)3361783
    Apache Thrift(TComapct)3060885

     

     

     

    序列化文件大小KB100100010000
    xstreamLibrary296295329522
    protostuff211107
    protobuffer211107
    Jackson(json序列化)939269258
    Apache Thrift(TBinary)211107
    Apache Thrift(TCompact)211107
  • 内存情况后续补上,可以先参考网上结论

     

    5a040a92cb81c.png

    5a040b5b56616_900x508.png

     

    总结:

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值