从 WasmEdge 运行环境读写 Rust Wasm 应用的时序数据
WebAssembly (Wasm) 正在成为一个广受欢迎的编译目标,帮助开发者构建可迁移平台的应用。最近 Greptime 和 WasmEdge 协作,支持了在 WasmEdge 平台上的 Wasm 应用通过 MySQL 协议读写 GreptimeDB 中的时序数据。
什么是 WebAssembly
WebAssembly 是一种新的指令格式,同时具备了跨平台和接近原生机器代码的执行速度。 通过将 C/C++ 或 Rust 代码编译成 WebAssembly ,可以在浏览器中提升程序的性能。而在浏览器外的其他运行环境,尤其是 CDN 或 IoT 的边缘端,我们也可以利用 WebAssembly 实现沙盒、动态加载的插件机制等高级的功能。
什么是 WasmEdge
WasmEdge 是 CNCF 的沙箱项目,提供上文提到的沙盒能力,允许开发者在 WebAssembly 标准的基础上,进一步扩展其能访问的资源和接口。例如,WasmEdge 为 Wasm 提供了额外的 TLS、网络能力和 AI 能力,大大丰富了使用场景。
WasmEdge GitHub 地址:https://github.com/WasmEdge/WasmEdge
安装 GreptimeDB 和 WasmEdge
如果你已经安装了 GreptimeDB ,可以跳过这个步骤。
下载 GreptimeDB 并运行:
安装 WasmEdge:
编写 GreptimeDB 的 WASM 应用
在 WasmEdge 中,我们可以使用 MySQL 协议,让 Rust 语言编写的应用程序连接到 GreptimeDB。
首先通过 cargo new
创建一个新的 Rust 项目,我们的编译目标将是 wasm32-wasi
,可以在项目根目录下创建 .cargo/config.toml
文件,指定默认编译目标,之后就无需在每次 cargo build
命令后专门指定 --target
了。
编辑 Cargo.toml
增加依赖。mysql_async
的应用需要 tokio
运行时,WasmEdge 维护了这两个库的修改版本,使他们能够编译成 WebAssembly 代码,并且运行到 WasmEdge 环境中。
进一步编辑 src/main.rs
文件,加入数据库访问的逻辑。这段代码将演示:
通过环境变量读取数据库地址,并创建连接池;
执行 SQL 语句创建数据表;
插入数据;
查询数据。
定义数据结构:
初始化数据库连接池:
创建数据表:
插入数据:
查询数据:
WasmEdge 团队提供的 tokio
和 mysql_async
库与原始版本编程接口完全一致,因此可以无缝地将普通 Rust 应用切换到 WebAssembly 平台上。
编译这个项目,我们可以获得 greptimedb.wasm 文件:
通过 WasmEdge 运行我们的程序:
上面这段示例程序已经纳入了 WasmEdge 的数据库使用示例,你可以在 GitHub 仓库找到完整的代码:https://github.com/WasmEdge/wasmedge-db-examples/tree/main/greptimedb。
总结
WasmEdge 为 WebAssembly 应用提供了更多的扩展能力。如果你也将应用部署在 WebAssembly 环境里,未来我们还可以使用 OpenTelemetry SDK 采集指标数据直接存储到 GreptimeDB 。现在就下载 GreptimeDB 或开通 GreptimeCloud 实例运行上面的例子吧。
评论