Kryo序列化库:它是否用于生产?

时间:2010-04-27 21:20:50

标签: java serialization kryo

Kryo是一个非常新颖且有趣的Java序列化库,是thrift-protobuf基准测试中速度最快的库之一。如果你已经使用过Kryo,它已经达到了足够的成熟度,可以在生产代码中试用吗?

更新(2010年10月27日):我们正在使用Kryo,但尚未投入生产。有关详细信息,请参阅下面的答案。

更新(2011年3月9日):更新到最新的Jackson和Kryo​​图书馆后,杰克逊的二元微笑序列化非常具有竞争力。

9 个答案:

答案 0 :(得分:23)

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

我们使用Restlet framework实现了一组约120种不同的Web服务。这些是由通常构建在基于Restlet的客户端库之上的Web服务客户端使用的。在服务器和客户端之间来回发送的表示包括XML(使用XStream serialization library),JSON(使用Jackson),XHTML,Java Object Serialization,以及截至昨天Kryo 。因此,我们可以进行一些可靠的并排比较。

Kryo 1.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()); }
  });

但这是迄今为止我发现的唯一可能的问题。我们有一组JavaBeans,它们包含String,Float,Integer,Long,Date,Boolean和List字段。

以下是一些粗略的基准。首先,我对一个描述一个电视节目的对象层次结构进行了100,000次序列化和反序列化(即,制作了100,000个深度拷贝)。速度是:

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团队!

更新(2011年3月9日):我终于找到了@ StaxMan建议尝试使用Jackson 1.6的二进制“Smile”序列化程序。使用Jackson 1.6和Kryo​​ 1.04,我做了100,000个不同的电视节目对象层次结构的深拷贝(序列化/反序列化):

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

此测试未与宏级别测试相结合,我在REST Web服务中尝试了不同的序列化程序,这些服务器提供了许多这些对象。总体系统吞吐量支持@ StaxMan对性能的直觉:

Jackson JSON:     92 requests/sec
Jackson Smile     97 requests/sec
Kryo:            108 requests/sec

答案 1 :(得分:16)

有一个bug report和一个discussion thread。 Kryo附带的DateSerializer在尺寸上比在SO上发布的SimpleSerializer实现稍微有效,因为它使用针对正值优化的LongSerializer。

编辑:我忘了回答原来的问题了。我相信Kryo至少用于几个生产系统。在这篇文章中提到了Jive SBS cache redesign: Part 3。在Destroy All Humans项目中,Kryo用于与作为机器人大脑的Android手机(video here)进行通信。

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

在上面的 Jim Ferrans 回复和评论的帮助下,我在此页面上找到了有关Kryo的日期序列化问题的更详细说明:http://groups.google.com/group/kryo-users/browse_thread/thread/91969c6f48a45bdf/ 以及如何使用Kryo的DateSerializer():

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

我希望这可以帮助别人。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

Kryo网站上有projects in production using Kryo

部分

答案 6 :(得分:1)

在将消息从一个任务传递到另一个任务之前,Apache Storm将其用于serialization

所以是的,它必须非常稳定,因为several huge companies使用了Storm,即Twitter和Spotify。

答案 7 :(得分:0)

Kuleo 2.x也被Mule ESB使用,因此广泛用于生产。

答案 8 :(得分:0)

2017年更新:

Flink使用Kryo。 所以几乎所有使用Flink框架的东西都依赖于Kryo。 参考:https://ci.apache.org/projects/flink/flink-docs-release-0.8/programming_guide.html#specifying-keys