跳到主要内容

Fury 0.6.0 发布

· 阅读需 5 分钟
杨朝坤

Apache Fury 团队很高兴宣布 0.6.0 版本发布。这是一个重要版本,包含来自 12 位贡献者的35 PR。请参阅Install页面了解如何获取适用于你平台的库。

亮点

在这个版本中,我们为 Java 的 Schema 演进引入了 scoped meta share 模式,并在 CompatibleMode=Compatible 时默认启用:

  • 相比之前的 KV compatible 模式,该模式性能提升约 50%,序列化载荷体积仅为此前的 1/6
  • 在复杂对象场景下,该模式比 Protobuf 快约 4 倍,序列化体积小于 Protobuf 的 1/2

PerfomanceSize

Protobuf/JSON 会以 KV 形式写入消息字段元信息和值。当序列化消息列表时,通常会遇到两个问题:

  • 即使消息类型相同,也会重复写入元信息。
  • KV 布局较为离散,不利于压缩。

meta share 模式会对同类型多个对象只写入一次字段名与字段类型元信息,因此相比 Protobuf 能显著节省空间并提升性能。

借助 meta share,我们可以仅写入一次 struct 的字段名与类型元信息,同时还可提前把元信息编码为二进制,再通过一次内存拷贝直接写入,从而进一步提升速度。

序列化数据

  public static class NumericStruct {
public int f1;
public int f2;
public int f3;
public int f4;
public int f5;
public int f6;
public int f7;
public int f8;

public static NumericStruct build() {
NumericStruct struct = new NumericStruct();
struct.f1 = 1;
struct.f2 = 2;
struct.f3 = 3;
struct.f4 = 4;
struct.f5 = 5;
struct.f6 = 6;
struct.f7 = 7;
struct.f8 = 8;
return struct;
}
}

public static class NumericStructList {
public List<NumericStruct> list;

public static NumericStructList build() {
NumericStructList structList = new NumericStructList();
structList.list = new ArrayList<>(1000);
for (int i = 0; i < 1000; i++) {
structList.list.add(NumericStruct.build());
}
return structList;
}

结果

性能:

Benchmark                       Mode  Cnt      Score      Error  Units
fury_deserialize thrpt 30 49667.900 ± 3004.061 ops/s
fury_kv_compatible_deserialize thrpt 30 33014.595 ± 3716.199 ops/s
fury_kv_compatible_serialize thrpt 30 23915.260 ± 3968.119 ops/s
fury_serialize thrpt 30 63146.826 ± 2930.505 ops/s
protobuf_deserialize thrpt 30 14156.610 ± 685.272 ops/s
protobuf_serialize thrpt 30 10060.293 ± 706.064 ops/s

体积:

LibSerialized Payload Size
fury8077
furystrict8009
furykv48028
protobuf18000

功能特性

缺陷修复

其他改进

新贡献者

完整更新日志https://github.com/apache/fury/compare/v0.5.1...v0.6.0