通过为 wasm-bindgen 新增 Emscripten 目标,在 Workers 中支持原生 Rust
内容提要
Cloudflare 为 wasm-bindgen 新增 Emscripten 目标,首次实验性支持在 Workers 上原生运行 Rust 代码及 Tokio 应用。团队改进了 Tokio 运行时与 Workers 事件循环的集成,并通过 40 多个 PR 为 Emscripten 加入 epoll、TCP、UDP 等套接字支持。测试中已在 Durable Object 内成功运行基于 Tokio 的 Rust 版 Minecraft 服务器 Pumpkin,实现多人联机与持久化存储。
延伸解读
实验性支持与生产就绪度
文章明确说明该功能仍处于实验性预览阶段,Tokio 支持补丁集尚未完全上游合并,部分补丁需要直接应用。这意味着当前版本不适合直接用于生产环境,开发者应关注后续稳定版本和上游集成进展。
Tokio 与 Workers 事件循环的集成方式
文章介绍了两种集成方案:JSPI 和 LocalEventLoop。JSPI 利用 Wasm 栈挂起机制,但需要处理线程本地上下文切换;LocalEventLoop 则通过将 Tokio 的等待替换为唤醒,使宿主事件循环驱动任务执行。两种方案各有适用场景,开发者需根据具体需求选择。
套接字支持与 Emscripten 补丁
为在 Workers 上支持 TCP、UDP 和 epoll,Cloudflare 向 Emscripten 贡献了 40 多个 PR,最终形成 -sNODERAWSOCKETS 编译选项。该选项通过 node:net API 桥接 Emscripten 虚拟化层与 Workers 套接字 API,使 Tokio 的 I/O 驱动无需修改即可运行。
Pumpkin 案例的实践启示
在 Durable Object 中运行 Pumpkin Minecraft 服务器展示了该目标的兼容性:通过将线程改为协作任务、使用 node:fs 桥接和 SQLite 存储,实现了持久化多人游戏。这表明原生 Rust 应用经过适当适配后,可以在 Workers 上运行,但需要处理线程模型和文件系统的差异。
Q&A
Cloudflare 为 wasm-bindgen 新增了什么目标,让 Rust 代码能在 Workers 上原生运行?
Cloudflare 为 wasm-bindgen 新增了 Emscripten 的 wasm32-unknown-emscripten 目标,首次实验性支持在 Workers 上原生运行 Rust 代码及 Tokio 应用。
为什么需要为 wasm-bindgen 添加 Emscripten 目标?
因为 Google 内部团队希望将 wasm-bindgen 与 Emscripten 结合使用,以便在 C++ 代码库中链接 Rust 依赖,同时获得 wasm-bindgen 的绑定系统。但两个工具都假设自己负责加载和交互 JavaScript,存在冲突,因此需要让它们协同工作。
Cloudflare 如何解决 Tokio 异步运行时与 Workers 单线程事件循环的兼容问题?
Cloudflare 提供了两种方案:一是利用 WebAssembly JavaScript Promise Integration (JSPI) 映射 Tokio 的 parking 语义,并处理线程本地上下文切换;二是为 Tokio 设计 LocalEventLoop 运行时,将 Tokio 的循环拆分为 drive() 操作和 wake 通知,由宿主事件循环驱动任务,避免阻塞。
在 Emscripten 上支持套接字和 epoll 需要哪些工作?
Cloudflare 向 Emscripten 贡献了 40 多个 PR,新增了 -sNODERAWSOCKETS 编译选项,通过 node:net API 桥接 Emscripten 虚拟化层与 Workers 的套接字 API,从而支持 epoll、TCP、UDP 和 Unix 套接字。
如何在 Workers 上运行一个 Rust 版 Minecraft 服务器?
使用 Pumpkin 服务器,将其线程模型改为基于 Tokio 的协作任务,利用 Emscripten 的 -sNODERAWFS 和 -sNODERAWSOCKETS 选项,通过 Durable Object 的 SQLite 存储实现持久化,并通过 Workers TCP 入口处理玩家连接。
这个新功能目前处于什么阶段,如何试用?
该功能处于实验性预览阶段,Cloudflare 提供了完整的补丁集和示例应用,包括构建 Emscripten Rust Workers、运行 Tokio 异步运行时、使用 TCP 套接字等,可在 GitHub 和 Cloudflare Discord 的 #rust-on-workers 频道获取。