阿里开源!又一款序列化框架来了,性能炸裂!
ccwgpt 2025-07-23 13:18 5 浏览 0 评论
Fury 是一个基于 JIT 动态编译和零拷贝的多语言序列化框架,支持 Java/Python/Golang/JavaScript/C++ 等语言,提供全自动的对象多语言 / 跨语言序列化能力,和相比 JDK 最高 170 倍的性能。
代码主仓库的 GitHub 地址为:
https://github.com/alipay/fury
官方网站:
https://furyio.org
背 景
序列化是系统通信的基础组件,在大数据、AI 框架和云原生等分布式系统中广泛使用。当对象需要跨进程、跨语言、跨节点传输、持久化、状态读写、复制时,都需要进行序列化,其性能和易用性影响运行效率和开发效率。
静态序列化框架 protobuf/flatbuffer/thrift 由于不支持对象引用和多态、需要提前生成代码等原因,无法作为领域对象直接面向应用进行跨语言开发。而动态序列化框架 JDK 序列化/Kryo/Fst/Hessian/Pickle 等,尽管提供了易用性和动态性,但不支持跨语言,且性能存在显著不足,并不能满足高吞吐、低延迟和大规模数据传输场景需求。
基于 Spring Boot + MyBatis Plus + Vue 3.2 + Vite + Element Plus 实现的前后端分离博客,包含后台管理系统,支持文章、分类、标签管理、仪表盘等功能。
GitHub 地址:
https://github.com/weiwosuoai/WeBlogGitee 地址:
https://gitee.com/AllenJiang/WeBlog
因此,我们开发了一个新的多语言序列化框架 Fury,并正式在 Github 开源。通过一套高度优化的序列化基础原语,结合 JIT 动态编译和 Zero-Copy 等技术,同时满足了性能、功能和易用性的需求,实现了任意对象自动跨语言序列化,并提供极致的性能。
Fury 简介
Fury 是一个基于 JIT 动态编译和零拷贝的多语言序列化框架,提供极致的性能和易用性:
序列化核心能力
尽管不同的场景对序列化有需求,但序列化的底层操作都是类似的。因此 Fury 定义和实现了一套序列化的基础能力,基于这套能力能够快速构建不同的多语言序列化协议,并通过编译加速等优化具备高性能。同时针对一种协议在基础能力上的性能优化,也能够让所有的序列化协议都受益。
序列化原语
序列化涉及的常见操作主要包括:
- bitmap 位操作
- 整数编解码
- 整数压缩
- 字符串创建 * 拷贝优化
- 字符串编码:ASCII/UTF8/UTF16
- 内存拷贝优化
- 数组拷贝压缩优化
- 元数据编码 & 压缩 & 缓存
Fury 针对这些操作在每种语言内部都做了大量的优化,结合 SIMD 指令和语言高级特性,将性能推到极致,从而方便不同协议使用。
零拷贝序列化
在大规模数据传输场景,一个对象图内部往往有多个 binary buffer,而序列化框架在序列化过程当中会把这些数据写入一个中间 buffer,引入多次耗时内存拷贝。Fury 借鉴了 pickle5、ray 以及 arrow 的零拷贝设计,实现了一套 Out-Of-Band 序列化协议,能够把一个对象图当中的所有 binary buffer 直接抓取出来,避免掉这些 buffer 的中间拷贝,将序列化期间的内存拷贝开销降低到 0。
下图是 Fury 关闭引用支持时 Zero-Copy 的大致序列化过程。
目前 Fury 内置了以下类型的 Zero-Copy 支持:
- Java:所有基本类型数组、ByteBuffer、ArrowRecordBatch、VectorSchemaRoot
- Python:array 模块的所有 array、numpy 数组、pyarrow.Table、pyarrow.RecordBatch
- Golang:byte slice
用户也可以基于 Fury 的接口扩展新的零拷贝类型。
JIT 动态编译加速
对于要序列化的自定义类型对象,其中通常包含大量类型信息,Fury利用这些类型信息在运行时直接生成高效的序列化代码,将大量运行时的操作在动态编译阶段完成,从而增加方法内联和代码缓存,减少虚方法调用 / 条件分支 /Hash 查找 / 元数据写入 / 内存读写等,最终大幅加速了序列化性能。
对于 Java 语言,Fury 实现了一套运行时代码生成框架,定义了一套序列化逻辑的算子表达式 IR,在运行时基于对象类型的泛型信息进行类型推断,然后构建一颗描述序列化代码逻辑的表达式树,根据表达式树生成高效的 Java 代码,再在运行时通过 Janino 编译成字节码,再加载到用户的 ClassLoader 里面或者 Fury 创建的 ClassLoader 里面,最终通过 Java JIT 编译成高效的汇编代码。
由于 JVM JIT 会跳过大方法编译和内联,Fury 也实现了一套优化器,将大方法递归拆分成小方法,这样就保证了 Fury 生成的所有代码都可以被编译和内联,压榨 JVM 的性能到极致。
同时 Fury 也支持异步多线程动态编译,将不同序列化器的代码生成任务提交到线程池执行,在编译完成之前使用解释模式执行,从而保证不会出现序列化毛刺,不需要提前预热所有类型的序列化。
Python 和 JavaScript 场景也是采用的类似代码生成方式,这样的生成方式开发门槛低,更容易排查问题。
由于序列化需要密切操作每种编程语言的对象,而编程语言并没有暴露内存模型的低阶 API,通过 Native 方法调用存在较大开销,因此我们并不能通过 LLVM 构建一个统一的序列化器 JIT 框架,而是需要在每种语言内部结合语言特性实现特定的代码生成框架以及序列化器构建逻辑。
静态代码生成
尽管 JIT 编译能够大幅提升序列化效率,并且在运行时能够根据数据的统计分布重新生成更优的序列化代码,但 C++/Rust 等语言不支持反射,没有虚拟机,也没有提供内存模型的低阶 API,因此我们无法针对这类语言通过 JIT 动态编译生成序列化代码。
对于此类场景,Fury 正在实现一套 AOT 静态代码生成框架,在编译时根据对象的 schema 提前生成序列化代码,然后使用生成的代码进行自动序列化。对于 Rust,未来也会通过 Rust 的 macro 在编译时生成代码,提供更好的易用性。
缓存优化
在序列化自定义类型时,会把字段进行重排序,保证相同接口类型的字段依次序列化,增加缓存命中的概率,同时也促进了 CPU 指令缓存,实现了更加高效的序列化。对于基本类型字段将写入顺序按照字节字段大小降序排列,这样如果开始地址是对齐的,随后的读写都会发生在内存地址对齐的位置,CPU 执行起来更加高效。
多协议设计与实现
基于 Fury 提供的多语言序列化核心能力,我们在这之上构建了三种序列化协议,分别适用于不同的场景:
- Java 序列化:适合纯 Java 序列化场景,提供最高百倍以上的性能提升;
- 跨语言对象图序列化:适合面向应用的多语言编程,以及高性能跨语言序列化;
- 行存序列化:适合分布式计算引擎如 Spark/Flink/Dories/Velox/ 样本流处理框架 / 特征存储等;
后续我们也会针对一些核心场景添加新的协议,用户也可以基于 Fury 的序列化能力构建自己的协议。
Java 序列化
由于 Java 在大数据、云原生、微服务和企业级应用的广泛使用,对 Java 序列化的性能优化可以大幅降低系统延迟,提升吞吐率,降低服务器成本。
因此 Fury 针对 Java 序列化进行了大量极致性能优化,我们的实现具备以下能力:
- 极致性能:通过利用 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 零拷贝和堆外内存读写。
基于 Spring Boot + MyBatis Plus + Vue 3.2 + Vite + Element Plus 实现的前后端分离博客,包含后台管理系统,支持文章、分类、标签管理、仪表盘等功能。
GitHub 地址:
https://github.com/weiwosuoai/WeBlogGitee 地址:
https://gitee.com/AllenJiang/WeBlog
跨语言对象图序列化
跨语言对象图序列化主要用于对动态性和易用性有更高要求的场景。尽管 Protobuf/Flatbuffer 等框架提供了多语言序列化能力,但仍然存在一些不足:
- 需要提前编写 IDL 并静态编译生成代码,不具备足够的动态性和灵活性;
- 生成的类不符合面向对象设计也无法给类添加行为,并不能作为领域对象 直接用于多语言应用开发。
- 不支持子类序列化。面向对象编程的主要特点是通过接口调用子类方法。这类模式也无法得到很好的支持。尽管 Flatbuffer 提供了 Union,Protobuf 提供了 OneOf/Any 特性,这类特性需要在序列化和反序列化时判断对象的类型,不符合面向对象编程的设计。
- 不支持循环和共享引用,需要针对领域对象重新定义一套 IDL 并自己实现引用解析,然后在每种语言里面编写代码实现领域对象和协议对象之间的相互转换,如果对象图嵌套层数较深,则需要编写更多的代码。
结合以上几点,Fury 实现了一套跨语言的对象图序列化协议:
- 多语言 / 跨语言 自动序列化任意对象:在序列化和反序列化端定义两个 Class,即可自动将一种语言的对象自动序列化为另一种语言的对象,无需创建 IDL 文件、编译 schema 生成代码以及手写转换代码;
- 多语言 / 跨语言自动序列化共享引用和循环引用;
- 支持对象类型多态,符合面向对象编程范式,多个子类型对象可以同时被自动反序列化,无需用户手动处理;
- 同时我们在这套协议上面也支持了 Out of band 零拷贝;
自动跨语言序列化示例:
行存序列化
对于高性能计算和大规模数据传输场景,数据序列化和传输往往是整个系统的性能瓶颈。如果用户只需要读取部分数据,或者根据对象某个字段进行过滤,反序列化整个数据将带来额外开销。因此 Fury 也提供了一套二进制数据结构,在二进制数据上直读直写,避开序列化。
Apache arrow 是一个成熟的列存格式,支持二进制读写。但列存并不能满足所有场景需求,在线链路和流式计算场景的数据天然就是行存结构,同时列式计算引擎内部在涉及到数据变更和 Hash/Join/Aggregation 操作时,也会使用到行存结构。
而行存并没有一个统一标准实现,计算引擎如 Spark/Flink/Doris/Velox 等都定义了一套行存格式,这些格式不支持跨语言,且只能被自己引擎内部使用,无法用于其它框架。尽管 Flatbuffer 能够支持按需反序列化,但需要静态编译 Schema IDL 和管理 offset,无法满足复杂场景的动态性和易用性需求。
因此 Fury 在早期借鉴了 spark tungsten 和 apache arrow 格式,实现了一套可以随机访问的二进制行存结构,目前实现了 Java/Python/C++ 版本,实现了在二进制数据上面直读直写,避免掉了所有序列化开销。
下图是 Fury Row Format 的二进制格式:
该格式密集存储,数据对齐,缓存友好,读写更快。由于避免了反序列化,能够减少 Java GC 压力。同时降低 Python 开销,同时由于 Python 的动态性,Fury 的数据结构实现了 _getattr__/getitem/slice/ 和其它特殊方法,保证了行为跟 python dataclass/list/object 的一致性,用户没有任何感知。
性能对比
这里给出部分 Java 序列化性能数据,其中标题包含 compatible 的图表是支持类型前后兼容下的性能数据,标题不包含 compatible 的图表是不支持类型前后兼容下的性能数据。为了公平起见,所有测试 Fury 关闭了零拷贝特性。
更多 benchmark 数据请参考 Fury Github 官方文档:
https://github.com/alipay/fury/tree/main/docs/benchmarks
未来规划
- 元数据压缩和自动共享
- 跨语言序列化支持类型前后兼容
- 静态代码生成框架,用于提前生成 c++/golang/rust 代码
- C++/Rust 支持跨语言对象图序列化
- Golang/Rust/JavaScript 支持行存
- 兼容 ProtoBuffer 生态,支持根据 Proto IDL 自动生成 Fury 序列化代码
- 新的协议实现:AI 特征存储,知识图谱序列化
- 持续改进我们的序列化基础原语,提供更高性能实现
- 标准化协议,提供二进制兼容性
- 文档和易用性改进
相关推荐
- VUE3前端开发入门系列教程二:使用iView框架辅助开发
-
1、安装iView新框架,支持VUE3npminstallview-ui-plus2、编辑src/main.js,添加以下内容,导入js和css到项目importViewUIPlusfrom...
- 万能前端框架uni app初探03:底部导航开发
-
前言本节我们使用uniapp的底部导航功能,点击不同tab会显示不同页面,这个功能在实际项目开发中几乎是必备的。一、基础知识1.tabBar如果应用是一个多tab应用,可以通过tabBar配...
- Rust Web 开发框架,前端你可以选择哪个?
-
Rust构建一切。在如今流行的语言中,Rust可谓是将构建和高效作为自己优美的身姿在大众视野中脱颖而出。它是一门赋予每个人构建可靠且高效软件能力的语言。它有什么特性呢?高性能。Rust速度惊人且内...
- 连载:前端开发中纠结的Javascript框架(上)
-
如今,前端开发有着许许多多的框架和库。其中一些好用,一些却不尽人意。通常我们会习惯性运用某一概念,模块或句法。事实上,并没有什么万能工具。这篇文章是关于未来框架的发展趋势——那就是没有框架!我从以下几...
- 前端开发框架的演进架构:提升用户体验和开发效率
-
前端开发框架是现代Web应用开发的重要工具,它不仅可以帮助开发者构建复杂的用户界面,还能够提升用户体验和开发效率。随着Web技术的不断发展,前端开发框架也在不断演进,为开发者提供了更丰富、更高效的工具...
- Google应用Mesh-TensorFlow框架,让CNN也能处理超高分辨率图像
-
为了要处理超高分辨率医疗图像数据,Google开发了一种空间数据分区(SpatialPartition)技术,在不牺牲图像分辨率的条件下,分析超高分辨率图像。Google使用Mesh-TensorF...
- 大模型安全挑战加剧:框架层漏洞成新靶心
-
近日,360数字安全集团发布了一份关于大模型安全漏洞的报告,揭示了当前大模型及围绕其构建的框架和应用中存在的严重安全问题。报告显示,360近期研究发现了近40个大模型相关的安全漏洞,其中既包括二进制内...
- Keras 3.0正式发布:可用于TensorFlow、JAX和PyTorch
-
机器之心报道编辑:陈萍经过5个月的更新迭代,Keras3.0终于来了。「大新闻:我们刚刚发布了Keras3.0版本!」Keras之父FrancoisChollet在X上激动的...
- TensorFlow和Keras入门必读教程(tensorflow与keras版本对应)
-
导读:本文对TensorFlow的框架和基本示例进行简要介绍。作者:本杰明·普朗什(BenjaminPlanche)艾略特·安德烈斯(EliotAndres)来源:华章科技01TensorFlo...
- 谷歌官方回应“TensorFlow遭弃”:还在投资开发,将与JAX并肩作战
-
鱼羊发自凹非寺量子位|公众号QbitAI终于,谷歌出面回应“TensorFlow遭弃”传闻:我们将继续致力于将TensorFlow打造为一流机器学习平台,与JAX并肩推动机器学习研究。这段时...
- 2025 年的PHP :现代 Web 开发的强大引擎
-
程序员还在吐槽PHP过时?2025年的PHP8.4直接封神了。看看最近更新的属性钩子、强类型系统,加上Laravel这些框架,老语言早就脱胎换骨。十年前说PHP弱类型容易崩代码的,现在脸疼不?联合类...
- 前端内卷终结者?htmx如何让开发者告别200行JS只做一个按钮
-
当你用React写一个点赞按钮需要引入3个状态管理库、编写80行JSX和120行钩子函数时,htmx只需要一行HTML:<buttonhx-post="/like"hx-sw...
- NativePHP桌面版V1.0正式发布(元气桌面电脑版下载)
-
导读:各位小伙伴,使用PHP构建桌面级系统的利器,NativePHP来了。概述NativePHP是一个用于使用PHP构建桌面应用的框架。它允许PHP开发人员使用熟悉的工具和技术创建跨平台的原生应用...
- PHP Laravel框架底层机制(php基本框架)
-
当然可以,Laravel是最受欢迎的PHP框架之一,以优雅的语法和丰富的生态而闻名。尽管开发体验非常“高端”,它的底层其实是由一系列结构清晰、职责分明的组件构成的。下面我从整体架构、核心流程、...
- PHP框架之Laravel框架教程:2. 控制器、路由、视图简单介绍
-
2.控制器、路由、视图简单介绍我们先建立控制器,目录是:app/Http/Controllers,新建控制器Ding.php,代码如下:Ding.php:<?phpnamespaceA...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- VUE3前端开发入门系列教程二:使用iView框架辅助开发
- 万能前端框架uni app初探03:底部导航开发
- Rust Web 开发框架,前端你可以选择哪个?
- 连载:前端开发中纠结的Javascript框架(上)
- 前端开发框架的演进架构:提升用户体验和开发效率
- Google应用Mesh-TensorFlow框架,让CNN也能处理超高分辨率图像
- 大模型安全挑战加剧:框架层漏洞成新靶心
- Keras 3.0正式发布:可用于TensorFlow、JAX和PyTorch
- TensorFlow和Keras入门必读教程(tensorflow与keras版本对应)
- 谷歌官方回应“TensorFlow遭弃”:还在投资开发,将与JAX并肩作战
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- orm框架有哪些 (51)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)