celld跑Rust:3步用workers-rs编译WASM并在自托管Durable Object中运行
【免费下载链接】celldself-hosted, distributed Durable Objects项目地址: https://gitcode.com/GitHub_Trending/ce/celld
celld 是一个自托管的分布式 Durable Object 运行时,内置 V8 引擎,可以直接执行 Wrangler 打包的 Worker 应用。如果你想在 celld 上用 Rust 编写有状态的 Worker,只需借助 workers-rs 生态把 Rust 代码编译成 WASM,再用celld deploy一键部署——本文带你完整走通这条链路。
先认识 celld:每个对象都有自己的数据库
celld 是一个开源守护进程,让你在自己的机器上运行 Cloudflare Workers 和 Durable Objects。它的核心设计非常简洁:
- 每个 Durable Object(cell)都是一座独立的 SQLite 数据库,天然分片,不存在共享数据库的争用问题
- 节点之间只通过一个 S3 兼容或 GCS 存储桶协调,没有控制平面、没有共识协议
- cell 的状态持续复制到存储桶,节点随时可替换
这套架构意味着:你的 Rust 应用不需要管理任何数据库基础设施,状态持久化由运行时兜底。
为什么把 Rust 编译成 WASM 跑在 Durable Object 里
用 Rust 写 Durable Object 的吸引力在于:
- 强类型 + 高并发:业务逻辑用 Rust 严格约束,编译为 WASM 后在 V8 中执行,性能与安全性兼得
- 零胶水代码:workers-rs 的构建工具会自动生成 JavaScript shim,你不需要手写任何 JavaScript
- 状态自动持久化:Rust 代码里调用
state.storage()读写,背后就是 celld 为这个对象维护的 SQLite,并持续复制到存储桶
官方文档对 WASM 的支持规则与 Wrangler 完全一致:导入.wasm文件得到的是编译后的模块而非字节串,在 Cloudflare 上能跑的 Worker 包在 celld 上也能跑。详见 docs/wasm.md。
准备环境:安装 worker-build 构建工具
workers-rs 提供worker-build工具,它会完成三件事:把 crate 编译到wasm32-unknown-unknown目标、对输出运行 wasm-bindgen、写出 JavaScript 入口文件shim.mjs。安装只需两条命令:
rustup target add wasm32-unknown-unknown cargo install worker-build仓库里自带一个完整的 Rust 示例,可以直接参考 examples/wasm/README.md。
编写 Rust Durable Object:计数器示例
以官方 Rust 计数器为例,核心代码非常短——一个Counter类处理每个/c/<名字>路径的计数器:
#[durable_object(fetch)] pub struct Counter { state: State } impl DurableObject for Counter { async fn fetch(&self, req: Request) -> Result<Response> { let n: u64 = self.state.storage().get("n").await.ok().flatten().unwrap_or(0); let n = n + 1; self.state.storage().put("n", &n).await?; Response::from_json(&json!({ "name": name, "n": n, "lang": "rust" })) } }完整源码见 examples/wasm/src/lib.rs,crate 配置(cdylib+worker依赖)见 examples/wasm/Cargo.toml。
wrangler.jsonc只需把main指向构建产物,并声明 Durable Object 绑定与迁移:
{ "name": "counter-demo-rs", "main": "build/worker/shim.mjs", "compatibility_date": "2026-01-01", "durable_objects": { "bindings": [{ "name": "COUNTER", "class_name": "Counter" }] }, "migrations": [{ "tag": "v1", "new_sqlite_classes": ["Counter"] }] }对应文件:examples/wasm/wrangler.jsonc。
编译 WASM 并用 celld 部署
构建和部署总共只有两条命令:
worker-build --release celld deploy . --bucket s3://my-cells-bucketcelld deploy会自动发现 WASM 导入、把.wasm文件上传到 bundle 旁边,并给部署打上wasm-v1特性标记。如果你的集群里有旧版本节点不支持该特性,部署时会立即报错,而不是等到请求时才失败。
运行阶段还有两层性能保障:
- 每个 WASM 模块对全进程只编译一次,之后的每个 isolate 都复用编译结果
- 冷激活 cell 时无需重复支付编译开销
验证运行:访问你的自托管 Durable Object
启动节点后,用 curl 验证状态持久化:
curl http://localhost:8080/c/hello # {"lang":"rust","n":1,"name":"hello"} curl http://localhost:8080/c/hello # n 递增——状态保存在 cell 里 curl http://localhost:8080/c/other # 不同的 cell,独立计数可以看到每次请求计数递增,而/c/other拥有自己独立的计数器——每个名字对应一个独立的 SQLite 数据库,这正是 Durable Object "按名字寻址"的核心模型。
注意事项与限制
- 运行时 API 边界:celld 提供的是 Cloudflare 运行时 API 面,workers-rs 中映射到缺失功能的 API 不可用,完整清单见 docs/cloudflare-compat.md
- 体积计入部署限制:WASM 字节数和 JavaScript 一样占用部署大小配额
- 编译失败会明确报错:无法编译的模块会抛出带文件名的
WebAssembly.CompileError - shim 的 Proxy 包装:worker-build 生成的 shim 用 JavaScript Proxy 包裹导出,celld 会透过该包装解析入口类和 Durable Object 类
更多细节(如 Worker Loader 动态加载 WASM)见 docs/wasm.md,项目整体使用方式参考 docs/README.md。
总结
用 celld 跑 Rust 的路径可以归纳为:worker-build编译出 shim + WASM →wrangler.jsonc指向 shim →celld deploy上传。整个过程你不需要写一行 JavaScript,Rust 代码即可获得分布式 Durable Object 的全部能力:每对象独立 SQLite、桶复制持久化、按名字寻址。对于想在自己基础设施上部署有状态 Worker 的团队,这是一条从源码到生产的最小链路。
【免费下载链接】celldself-hosted, distributed Durable Objects项目地址: https://gitcode.com/GitHub_Trending/ce/celld
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考