作者: 罗宇侠, Keith Lee, Anton Borisov
这是 Fluss 多语言原生客户端的首个正式版本,标志着 Apache Fluss 正式突破 JVM 生态边界,向 Rust、Python 和 C++ 开发者开放实时流式存储能力。
过去数月,社区从零开始构建了完整的多语言客户端体系,累计完成 210+ 次代码提交。三个客户端共享同一个 Rust 核心引擎,上层提供轻量的语言绑定,从一开始就确保了原生性能与功能一致性。主要亮点包括:
- • 完整支持 Fluss 所有表类型:Log 表、主键表和分区表
- • 基于 Apache Arrow 的零拷贝(Zero-Copy)数据交换,与 Polars、Pandas、DuckDB 等工具无缝集成
- • 直接从分层存储(Tiered Storage)读取历史数据,绕过服务端中转,显著降低回放开销
- • 幂等写入(Idempotent Write)和内存感知反压(Backpressure),满足生产环境的可靠性需求
统一的 Rust 核心架构
与传统的"每种语言各写一套客户端"不同,Fluss 社区做出了一个关键的架构决策:以 Rust 作为统一内核,Python 和 C++ 作为上层绑定。
协议协商、批量发送、重试机制、Arrow 序列化等核心逻辑只需实现一次,所有语言共享同一套经过充分测试的代码路径。Rust 的内存安全和零成本抽象(Zero-Cost Abstraction)保证了核心引擎的性能与可靠性,而 Python(通过 PyO3)和 C++(通过 FFI)的绑定层则保持轻量,专注于提供符合各自语言习惯的 API。
这一设计带来的直接收益是:新功能只需在 Rust 核心中实现一次,即可同步覆盖三种语言,大幅降低维护成本的同时,也确保了跨语言的功能一致性。
支持所有 Fluss 表类型
本次发布完整支持 Fluss 的三种表类型:
- • Log 表:用于流式追加写入,支持基于订阅的轮询消费。典型场景包括点击流、IoT 传感器数据和审计日志。
- • 主键表(Primary Key Table):支持 Upsert、Delete 和基于主键的点查(Point Lookup),并支持部分列更新。典型场景包括商品目录和由多数据源驱动的实时仪表盘。
- • 分区表:Log 表和主键表均支持分区,读写操作具备分区感知能力。
所有表类型均支持幂等写入和内存感知的反压机制,可直接用于生产环境。Scanner 内置了基于优先级队列的远程 Segment 并行预取机制,确保大规模扫描场景下的高吞吐。Python 客户端还额外提供了 Polars 和 Pandas 的专属 API,可无缝融入 DataFrame 工作流。
以下是 Rust 客户端的一个简单示例:
// 创建连接let conn = FlussConnection::new(conn_config).await;let admin = conn.get_admin();// 建表let table_descriptor = TableDescriptor::builder() .schema( Schema::builder() .column("c1", DataTypes::int()) .column("c2", DataTypes::string()) .build(), ) .build();admin.create_table(&table_path, &table_descriptor, true).await?;// 写入数据let table = conn.get_table(&table_path).await;let writer = table.new_append().create_writer();let batch = record_batch!( ("c1", Int32, [1, 2, 3]), ("c2", Utf8, ["a", "b", "c"]))?;writer.append(batch)?;writer.flush().await?;// 消费数据let scanner = table.new_scan().create_log_scanner();scanner.subscribe(0, 0).await;let records = scanner.poll(Duration::from_secs(10)).await?;
零拷贝 Arrow 集成
全面拥抱 Apache Arrow 生态——无论使用 Polars、Pandas、DuckDB、DataFusion 还是直接使用 Arrow,客户端都原生支持 Arrow 格式。
整个数据链路中,日志记录均以 Arrow RecordBatch 形式表示。从 Fluss 获取的数据可以直接传递给下游工具,无需任何额外的序列化或格式转换。批量扫描(Batch Scanner)模式直接返回完整的 RecordBatch,开箱即用:
- • Python 用户:数据可直接传给 Polars 或 Pandas 进行分析
- • C++ 应用:可将数据直接输入 DuckDB 进行查询
Java 客户端目前不提供此能力——Flink 和 Spark 在摄入数据时会将其转换为各自的内部行格式。而对于原生客户端生态来说,省去这一步转换,正是性能提升的关键。
直接读取分层存储
Fluss 会将较旧的日志 Segment 下沉到远端对象存储。当需要回放或回填历史数据时,客户端直接从对象存储读取这些 Segment,无需经由服务端中转。这样做既避免了回放负载对在线服务的冲击,也省去了数据在集群中的额外搬运。
支持的存储后端(通过 Feature Flag 启用):
- •
storage-fs — 本地文件系统(默认) - •
storage-oss — 阿里云对象存储 OSS
内置基于优先级队列的预取系统,支持可配置的并发下载数,确保顺序扫描不会因对象存储的网络延迟而阻塞。
更多特性
本次发布还包含以下重要能力:
- • SASL/PLAIN 认证:三个客户端均支持安全认证,满足生产环境的安全需求
- • 完整的 Admin API:支持数据库和表的创建、删除、列举、分区管理、Offset 查询等完整管理操作
- • 异步批量写入(Fire-and-Forget):支持可配置的 Bucket 分配策略(Hash、Round-Robin),高效利用网络带宽
- • 列裁剪(Column Pruning):只读取所需的列,减少网络传输和内存开销
- • 丰富的数据类型:完整支持基础类型、Decimal、时间类型(Date、Time、Timestamp)、Binary、String 等
快速开始
三种语言的客户端均已发布,即刻可用:
- • Rust:
fluss-rs 已发布到 crates.io,参见 安装指南[1] - • Python:
pyfluss 已发布到 PyPI(pip install pyfluss),参见 安装指南[2] - • C++:
fluss-cpp 通过 CMake / Bazel 构建,参见 安装指南[3].
未来规划
这是 fluss-rs、pyfluss 和 fluss-cpp 的首个版本,社区正在积极拓展更多能力。未来的发展方向包括:
贡献者名单
Apache Fluss Rust 社区衷心感谢所有为本次版本做出贡献的开发者:
AlexZhao, Andrea Bozzo, Anton Borisov, Arnav Panjla, Chase Naples, Evan, Jark Wu, Junbo Wang, Junfan Zhang, Kaiqi Dong, Karan Pradhan, Keith Lee, Kelvin Wu, Miao, Nikhil Negi, Pavlos-Petros Tournaris, Prajwal Banakar, SkylerLin, Yang Guo, Yuxia Luo, naivedogger, tison
Apache Fluss Rust 正在持续迭代中,欢迎关注项目动态,体验试用。如果你喜欢这个项目,欢迎在 GitHub 上点赞支持!
[1] https://clients.fluss.apache.org/user-guide/rust/installation/[2] https://clients.fluss.apache.org/user-guide/python/installation/[3] https://clients.fluss.apache.org/user-guide/cpp/installation/
欢迎 star 🌟 和加入 Apache Fluss 贡献:
https://github.com/apache/fluss/
欢迎加入"Fluss 社区交流群"群的钉钉群号: 109135004351