< 返回版块

MalikHou 发表于 2026-02-10 23:57

Tags:日报

高性能存储引擎 eloqstore api 层拥抱 rust

eloqstore 是什么?

eloqstore 是一款基于 iouring 的高性能混合层键值存储引擎,它将对象存储(兼容 S3)与本地 NVMe SSD 相结合,可提供卓越的写入吞吐量和亚毫秒级的读取延迟。是 EloqData 数据库产品的基础存储层,使基于 SSD 的工作负载能够实现类似内存的延迟特性,同时保持持久性和成本效益。


How to do?

eloqstore Rust SDK 是一个让 eloqstore 源码在 Rust 程序中运行时完整性和高效性而封装的 FFI 层。对于存储引擎而言提供给开发者一套简洁高效的接口,就是作为SDK最大的优势。它的核心目的是作为一个简单且高效的定制传话层,将 Rust 中的操作传递到 eloqstore 内核,原封不动地执行,然后将结果返回给 Rust 层。其做法大致分为如下几个阶段:

前提

  • 边界只走 C ABI:所有导出函数 extern "C",不导出 C++ 类/STL/模板。
  • 异常不跨边界:C++ wrapper 内部 try/catch(...) → 错误码。
  • 所有权清晰:跨边界内存“谁分配谁释放”,必要时提供 free_xxx()。

选择导出 API

  • 列出核心操作(read/write/scan 等),将其添加 C API 头文件;
  • C++:extern "C" 导出一组面向过程的 API;内部调用真实 C++ 类/模板;
  • Rust:extern "C" 声明 + unsafe 调用 + RAII 封装成安全 API。
  • 其中我们需要改变一些数据结构布局:
  1. 字符串/bytes:统一用 (const uint8_t* ptr, size_t len) 或 (const char* ptr, size_t len);
  2. caller-allocated:Rust 传入 buffer 指针+容量,C++ 填充并返回实际长度;
  3. callee-allocated:C++ malloc/new 出来,Rust 用 free_xxx() 释放(最常用)。

编译动态库

  1. C++ 编译成 libeloqstore_combine.so;
  2. Rust 运行时要能找到动态库(rpath / env).

创建 Rust crate 作为“调用层”

.
|-- Cargo.lock
|-- Cargo.toml
|-- README.md
|-- docs
|   |-- API.md
|   |-- LINKING.md
|   `-- QUICK_START.md
|-- eloqstore                              # 上层安全封装 crate(推荐)
|   |-- Cargo.toml
|   |-- README.md
|   |-- examples
|   |   |-- basic_usage.rs
|   |   `-- cloud_storage.rs
|   |-- src
|   |   |-- error.rs
|   |   |-- lib.rs
|   |   |-- request.rs
|   |   |-- response.rs
|   |   |-- store.rs
|   |   `-- traits.rs
|   `-- tests
|       |-- integration_test.rs
|       `-- simple_bench.rs
`-- eloqstore-sys                           # 低层 FFI crate(推荐)
    |-- Cargo.toml
    |-- build.rs
    |-- src
    |   |-- embedded_lib.rs
    |   |-- error.rs
    |   |-- lib.rs
    |   `-- types.rs
    `-- vendor
        |-- CMakeLists.txt
        |-- README.md
        |-- external -> ../../../external
        |-- ffi
        |   |-- include
        |   |   `-- eloqstore_capi.h
        |   `-- src
        |       `-- eloqstore_capi.cpp
        |-- include -> ../../../include
        `-- src -> ../../../src

Rust 侧“链接动态库”

用 build.rs 告诉 Cargo:去哪里找 + 链接哪个库。

[package]
name = "eloqstore-sys"
version = "0.1.0"
edition = "2024"
build = "build.rs"

[dependencies]
libc = "0.2"
tempfile = "3"

[features]
default = []
metrics = []

[build-dependencies]
cmake = "0.1"

再编写 build.rs

手写 Rust FFI 声明

-> /eloqstore/rust/eloqstore-sys/vendor/ffi

总结

EloqStore Rust SDK 通过精心设计的 FFI 架构,实现了:

  1. 零拷贝传输:FFI 边界只复制一次,最小化内存开销
  2. 类型安全:Rust 端完全类型安全,编译时保证正确性
  3. 批量性能:充分利用 COW B-tree 架构,批量写性能极佳
  4. 双 API 设计:简单场景用 RocksDB-style,复杂场景用 Request Trait
  • https://github.com/eloqdata/eloqstore
  • https://github.com/eloqdata/eloqstore/wiki/SDK-Rust

Rust基金会2025年度报告及三年战略规划

  • https://rustfoundation.org/media/annual-report-strategy-2025/

--

From 日报小组 侯盛鑫

社区学习交流平台订阅:

  • (Rustcc论坛: 支持rss)[https://rustcc.cn/]
  • (微信公众号:Rust语言中文社区)[https://rustcc.cn/article?id=ed7c9379-d681-47cb-9532-0db97d883f62]

评论区

写评论

还没有评论

1 共 0 条评论, 1 页