Google App Engine(GAE)上的高性能Java对象序列化

时间:2013-12-03 10:19:52

标签: java google-app-engine serialization

我们正在为GAE上的Java对象寻找高性能的紧凑型序列化解决方案。

本机Java序列化不能很好地执行,并且在兼容性方面很糟糕,即如果将字段添加到类中或将其删除,则无法对旧对象进行反序列化。

我们尝试了Kryo,它在其他环境中表现良好,并且在添加字段时支持后兼容性,但不幸的是GAE SecurityManager通过在递归中为每个方法调用添加一个检查来减慢它的速度。我担心这可能是所有序列化库的问题。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:2)

要注意,过早的优化是万恶之源。

您应首先尝试其中一种标准解决方案,然后确定它是否符合您的性能要求。我在GAE(java序列化,JSON,JSON + ZIP)上测试了几个序列化解决方案,它们比数据存储访问快了一个数量级。

因此,如果序列化数据需要10毫秒并将其写入数据存储区需要100毫秒,那么在尝试优化10毫秒时几乎没有额外的好处。

是的,你试过杰克逊吗?

此外,GAE上的所有API调用都实现为对其他服务器的RPC调用,其中有效负载被序​​列化为protobuf。

答案 1 :(得分:1)

你需要跨语言能力吗?并重新。高性能是指仅限速度,还是包括针对较少GC的优化内存管理,或包括序列化对象大小?

如果您需要跨语言,我认为Google的protobuf是一个解决方案。但是,它很难被称为“高性能”,因为在Java端创建的UTF-8字符串会导致常量GC。

如果您支持的数据大多是简单的对象,而您不需要合成,我建议您编写自己的序列化层(而不是开玩笑)。

  • 使用枚举对字段编制索引,以便序列化仅包含值的字段
  • 使用trove4j集合为基本类型创建地图。
  • 如果您可以预测大多数对象的大小在某个值之下,则使用缓存的ByteBuffer对象。
  • 使用字符串字典减少字符串对象的重新创建,并在反序列化期间使用缓存的StringBuilder

这就是我们为“高性能”java序列化层所做的。基本上,我们可以在合理的时机上实现几乎无对象的序列化/反序列化。