代码之家  ›  专栏  ›  技术社区  ›  Jim Ferrans

Kryo序列化库:是否在生产中使用?

  •  36
  • Jim Ferrans  · 技术社区  · 14 年前

    Kryo thrift-protobuf 基准。如果您已经使用过Kryo,那么它是否已经达到足够的成熟度,可以在生产代码中进行尝试?

    更新(2010年10月27日): 我们正在使用Kryo,虽然还没有投入生产。详情请参阅下面我的答案。

    更新到最新的Jackson和Kryo库表明,Jackson的二进制Smile序列化非常有竞争力。

    9 回复  |  直到 10 年前
        1
  •  17
  •   zpon    11 年前

    有一个 bug report 和一个 discussion thread . Kryo附带的DateSerializer在大小方面比发布在SO上的SimpleSerializer实现稍微有效一些,因为它使用了为正值优化的lonserializer。

    编辑:我忘了回答原来的问题。我相信Kryo至少用于一些生产系统。在这篇文章中有提到, Jive SBS cache redesign: Part 3 . 在 Destroy All Humans video here ).

    不是直接的回答,但你可以浏览 Kryo source 和/或 javadocs . 检查Kryo类上的read*和write*方法,然后查看Serializer类。这真是图书馆的核心。

        2
  •  23
  •   Jim Ferrans    13 年前

    我会试着回答我自己的问题(Kyro还是很新的!)。

    我们使用 Restlet framework . 这些都是由通常构建在基于Restlet的客户机库之上的web服务客户机使用的。在服务器和客户机之间来回发送的表示包括XML(使用 XStream serialization library Jackson Java Object Serialization 从昨天开始, Kryo . 所以我们可以做一些比较。

    kryo1.0.1看起来相当稳定。一旦我真正了解了如何使用API,我发现唯一真正的问题是默认的java.util.Date序列化程序似乎将日期扭曲到了过去的几个月。我只需要提供我自己的覆盖:

    kryo.register(Date.class, 
      new SimpleSerializer<Date>() {
       @Override public void write (ByteBuffer b, Date d) { b.putLong(d.getTime()); }
       @Override public Date read (ByteBuffer b) { return new Date(b.getLong()); }
      });
    

    但这是我目前发现的唯一可能的问题。我们有一组javabean,它们有String、Float、Integer、Long、Date、Boolean和List字段。

    这里有一些粗略的基准。首先,我对描述一个电视节目的对象层次结构进行了100000次序列化和反序列化(也就是说,对它进行了100000次深度复制)。速度是:

    XStream XML:                 360/sec
    Java Object Serialization: 1,570/sec
    Jackson JSON:              5,000/sec
    Kryo:                      8,100/sec
    

    接下来,我还序列化了2000个电视节目描述和计数字节的目录:

    XStream XML:         6,837,851 bytes
    Jackson JSON:        3,656,654 bytes
    Kryo:                1,124,048 bytes
    

    我还发现注册序列化程序非常重要:

    kryo.register(List.class);
    kryo.register(ArrayList.class);
    // ...
    kryo.register(Program.class);
    kryo.register(Catalog.class);
    // ...
    

    如果我不这样做,序列化的大小几乎是原来的两倍,速度可能慢了40%。

    我们还使用这四种序列化方法中的每种方法对几个web服务进行了完整的端到端测试,测试还表明Kryo的运行速度比其他方法快。

    总之,Kryo看起来相当健壮。我将在我们的代码库中保持对它的支持,随着我们对它的经验积累,我希望在更多的地方使用它。为Kryo团队干杯!

    更新(3/9/2011): 我终于想到@StaxMan的建议,试试jackson1.6的二进制“微笑”序列化程序。使用Jackson 1.6和Kryo 1.04,我对一个稍有不同的电视节目对象层次结构进行了100000次深度复制(序列化/反序列化):

    XStream XML:     429/sec    5,189 bytes
    Jackson JSON:  4,474/sec    2,657 bytes
    Kryo:          4,539/sec    1,066 bytes  
    Jackson Smile: 5,040/sec    1,689 bytes
    

    这个测试与宏级测试不匹配,在宏级测试中,我在一个restweb服务中尝试了不同的序列化程序,该服务提供了许多这样的对象。总体系统吞吐量支持@StaxMan对性能的直觉:

    Jackson JSON:     92 requests/sec
    Jackson Smile     97 requests/sec
    Kryo:            108 requests/sec
    
        3
  •  4
  •   Sanmi    14 年前

    Kryo是雅虎S4(简单可扩展流媒体系统)项目的一部分。据我所知,S4还没有生产。

        4
  •  2
  •   Jagoliveira    13 年前

    在…的帮助下 上面的回复和评论我在这个页面上找到了关于Kryo日期序列化问题的更详细的解释: http://groups.google.com/group/kryo-users/browse_thread/thread/91969c6f48a45bdf/

    kryo.register(Date.class,new DateSerializer());

    我希望这能帮助别人。

        5
  •  1
  •   Chris Dennett    13 年前

    Kryo的最新版本在一些极端情况下有一些竞争条件,运行在Java的ns-3模拟器接口上。如果没有问题,可能会要求开发人员提交我的一些更改。

        6
  •  1
  •   Jim Ferrans    10 年前

    Apache Storm用它来 serialization

    所以是的,它必须是相当稳定的,因为风暴是由 several huge companies ,即Twitter和Spotify。

        7
  •  1
  •   jackrabb1t    10 年前

    kryo2.x也被muleeb使用,因此在生产中被广泛使用。

        9
  •  1
  •   roomsg    6 年前