点击“终码一生”,关注,置顶公众号
每日技术干货,第一时间送达!
-
GitHub 地址为:https://github.com/alipay/fury -
官方网站:https://furyio.org
1
2
3
-
bitmap 位操作 -
整数编解码 -
整数压缩 -
字符串创建 * 拷贝优化 -
字符串编码:ASCII/UTF8/UTF16 -
内存拷贝优化 -
数组拷贝压缩优化 -
元数据编码 & 压缩 & 缓存
-
Java:所有基本类型数组、ByteBuffer、ArrowRecordBatch、VectorSchemaRoot -
Python:array 模块的所有 array、numpy 数组、pyarrow.Table、pyarrow.RecordBatch -
Golang:byte slice
4
-
跨语言对象图序列化:适合面向应用的多语言编程,以及高性能跨语言序列化; -
行存序列化:适合分布式计算引擎如 Spark/Flink/Dories/Velox/ 样本流处理框架 / 特征存储等;
5
-
极致性能:通过利用 Java 对象的类型和泛型信息,结合 JIT 编译、Unsafe 低阶操作,Fury 相比 JDK 最高有 170 倍的性能提升,相比 Kryo/Hessian 最高有 50~100 倍的性能提升。 -
100% JDK 序列化 API 兼容性:支持了所有 JDK 自定义序列化方法 writeObject/readObject/ writeReplace/ readResolve/readObjectNoData 的语义,保证任意场景替换 JDK 序列化的正确性。而已有的 Java 序列化框架如 Kryo/Hessian 在这些场景,都存在一定的正确性问题 -
类型前后兼容:在反序列化端和序列化端 Class Schema 不一致时,仍然可以正确反序列化,支持应用独立升级部署,独立增删字段。并且我们对元数据进行了极致的压缩和共享,类型兼容模式相比类型强一致模式做到了几乎没有任何性能损失。 -
元数据共享:在某个上下文 (TCP 连接) 下多次序列化之间共享元数据(类名称、字段名称、Final 字段类型信息等),这些信息会在该上下文下第一次序列化时发送到对端,对端可以根据该类型信息重建相同的反序列化器,后续序列化可以避免传输元数据,减小网络流量压力,同时也自动支持类型前后兼容。 -
零拷贝支持:支持 Out of band 零拷贝和堆外内存读写。
-
需要提前编写 IDL 并静态编译生成代码,不具备足够的动态性和灵活性; -
生成的类不符合面向对象设计也无法给类添加行为,并不能作为领域对象 直接用于多语言应用开发。 -
不支持子类序列化。面向对象编程的主要特点是通过接口调用子类方法。这类模式也无法得到很好的支持。尽管 Flatbuffer 提供了 Union,Protobuf 提供了 OneOf/Any 特性,这类特性需要在序列化和反序列化时判断对象的类型,不符合面向对象编程的设计。 -
不支持循环和共享引用,需要针对领域对象重新定义一套 IDL 并自己实现引用解析,然后在每种语言里面编写代码实现领域对象和协议对象之间的相互转换,如果对象图嵌套层数较深,则需要编写更多的代码。
-
多语言 / 跨语言 自动序列化任意对象:在序列化和反序列化端定义两个 Class,即可自动将一种语言的对象自动序列化为另一种语言的对象,无需创建 IDL 文件、编译 schema 生成代码以及手写转换代码; -
多语言 / 跨语言自动序列化共享引用和循环引用; -
支持对象类型多态,符合面向对象编程范式,多个子类型对象可以同时被自动反序列化,无需用户手动处理; -
同时我们在这套协议上面也支持了 Out of band 零拷贝;


6
-
元数据压缩和自动共享 -
跨语言序列化支持类型前后兼容 -
静态代码生成框架,用于提前生成 c++/golang/rust 代码 -
C++/Rust 支持跨语言对象图序列化 -
Golang/Rust/JavaScript 支持行存 -
兼容 ProtoBuffer 生态,支持根据 Proto IDL 自动生成 Fury 序列化代码 -
新的协议实现:AI 特征存储,知识图谱序列化 -
持续改进我们的序列化基础原语,提供更高性能实现 -
标准化协议,提供二进制兼容性 -
文档和易用性改进
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
往期推荐


