dubbo序列化以及各种序列化性能对比

dubbo RPC是dubbo体系中最核心的一种高性能、高吞吐量的远程调用方式

dubbo RPC主要用于两个dubbo系统之间作远程调用,特别适合高并发、小数据的互联网场景

而序列化对于远程调用的响应速度、吞吐量、网络带宽消耗等同样也起着至关重要的作用

  • 专门针对Java语言的:Kryo,FST等等
  • 这些序列化方式的性能多数都显著优于hessian2(甚至包括尚未成熟的dubbo序列化)。

    有鉴于此,我们为dubbo引入Kryo和FST这两种高效Java序列化实现,来逐步取代hessian2。

  • 在面向生产环境的应用中,我建议目前更优先选择Kryo。

  • 启用Kryo和FST

    使用Kryo和FST非常简单,只需要在dubbo RPC的XML配置中添加一个属性即可:

    <dubbo:protocol name="dubbo" serialization="kryo"/>
    <dubbo:protocol name="dubbo" serialization="fst"/>

    注册被序列化类

    要让Kryo和FST完全发挥出高性能,最好将那些需要被序列化的类注册到dubbo系统中,例如,我们可以实现如下回调接口:

    public class SerializationOptimizerImpl implements SerializationOptimizer {
    
        public Collection<Class> getSerializableClasses() {
            List<Class> classes = new LinkedList<Class>();
            classes.add(BidRequest.class);
            classes.add(BidResponse.class);
            classes.add(Device.class);
            classes.add(Geo.class);
            classes.add(Impression.class);
            classes.add(SeatBid.class);
            return classes;
        }
    }

    然后在XML配置中添加:

    <dubbo:protocol name="dubbo" serialization="kryo" optimizer="com.alibaba.dubbo.demo.SerializationOptimizerImpl"/>

    在注册这些类后,序列化的性能可能被大大提升,特别针对小数量的嵌套对象的时候。

  • 当然,在对一个类做序列化的时候,可能还级联引用到很多类,比如Java集合类。针对这种情况,我们已经自动将JDK中的常用类进行了注册,所以你不需要重复注册它们(当然你重复注册了也没有任何影响),包括:

  • GregorianCalendar
    InvocationHandler
    BigDecimal
    BigInteger
    Pattern
    BitSet
    URI
    UUID
    HashMap
    ArrayList
    LinkedList
    HashSet
    TreeSet
    Hashtable
    Date
    Calendar
    ConcurrentHashMap
    SimpleDateFormat
    Vector
    BitSet
    StringBuffer
    StringBuilder
    Object
    Object[]
    String[]
    byte[]
    char[]
    int[]
    float[]
    double[]
    

     

Dubbo RPC中不同序列化生成字节大小比较

序列化生成字节码的大小是一个比较有确定性的指标,它决定了远程调用的网络传输时间和带宽占用。

针对复杂对象的结果如下(数值越小越好):

序列化实现请求字节数响应字节数
Kryo27290
FST28896
Dubbo Serialization430186
Hessian546329
FastJson461218
Json657409
Java Serialization963630

no image found

Dubbo RPC中不同序列化响应时间和吞吐量对比

远程调用方式平均响应时间平均TPS(每秒事务数)
REST: Jetty + JSON7.8061280
REST: Jetty + JSON + GZIPTODOTODO
REST: Jetty + XMLTODOTODO
REST: Jetty + XML + GZIPTODOTODO
REST: Tomcat + JSON2.0824796
REST: Netty + JSON2.1824576
Dubbo: FST1.2118244
Dubbo: kyro1.1828444
Dubbo: dubbo serialization1.436982
Dubbo: hessian21.496701
Dubbo: fastjson1.5726352

no image found

no image found

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值