但是,Aurabase 的默认模式仍然是 Deno(V8 也隔离),如 Aurabase 的 Rust 核心中所述。 “Rust 中的边缘功能”根据平台涵盖了三种不同的现实:Cloudflare 端的社区 SDK、Vercel 端没有官方路线、Aurabase 端具有自己的 CLI 的本机执行模式。此比较详细介绍了三种架构,但没有混淆已验证的内容和仍然是平台目标的内容。
要点
- Aurabase 提供两种 Edge Functions 运行时:
deno(V8 隔离、专用服务、默认模式)和wasm(Rust 编译,通过 Wasmtime 本地运行)。 - Cloudflare Workers 在 V8 隔离上运行,并且还可以运行 WebAssembly,特别是通过
workers-rs社区 SDK。它不是像 Aurabase 的wasm模式那样的专用本机 Rust 运行时。 - Vercel Edge Functions 依赖于 Edge Runtime,它是隔离 V8 上的 Node.js API 的子集:没有官方 SDK 或 CLI 可以用 Rust 编写函数本身。
- Aurabase 的
wasm模式通过 Wasmtime 燃料 CPU 预算、专用内存限制和每个周期的超时来隔离每次执行,但目前不向访客模块公开任何传出网络访问。 - 三种不同的架构实现相同的目标:快速启动并隔离每次执行,而无需花费完整容器的成本。
V8 隔离和 WASM 模块:两种沙箱机制
V8 隔离是同一 V8 引擎内的轻量级 JavaScript 执行上下文:不需要新的系统进程,不需要启动新的内核。这是 Cloudflare 首次向 Workers 公开的机制,Vercel 在其 Edge Runtime 中重用了该机制。双方的目标是相同的:避免每个请求的容器或虚拟机成本。
WebAssembly 模块通过不同的机制满足相同的需求。 WASM 字节码在由规范本身定义的有界线性内存中运行。无论生成二进制文件的源语言(Rust、C、Go…)如何,来宾模块都无法在该区域之外寻址。 Wasmtime 在 Aurabase 的 wasm 模式中应用的正是这个模型,下面详细介绍。有关两种机制之间的启动测量,请参阅 WebAssembly 冷启动基准测试中的 文件。
Aurabase wasm 模式在生产环境中运行
每个 Aurabase 函数都带有一个 runtime 字段,其值是 "wasm" 或 "deno"。调用引擎相应地选择执行路径:
沙箱依赖于三种 Wasmtime 机制的结合。 CPU 预算计入“燃料”:每个 WASM 指令都会消耗它。以纪元增量应用超时:专用线程在配置的延迟后增加 Wasmtime 时钟,这会中断当前的执行。通过 StoreLimits设置内存限制。三个终端在引擎实例化时配置:
已编译的模块由 code_hash缓存:每次调用时不会重新编译相同的部署二进制文件。尽管如此,每次调用都会实例化一个新的 Store 和实例。从一次调用到下一次调用都不会发生状态泄漏。暴露给来宾模块的表面区域故意保持最小,总共五个主机函数: aura.log、 aura.get_input、 aura.set_output、 aura.get_env 和一个用于 AssemblyScript 兼容性的存根 env.abort 。此时没有主机函数公开传出网络调用。
wasm 模式现在适用于纯计算:验证、数据转换、评分、分析。必须调用第三方API(支付、电子邮件、外部服务)的功能仍然必须经过deno模式。这是 Aurabase 的默认模式,也是迁移现有 Deno 代码的推荐模式。
在部署方面,CLI 在发送之前在本地编译您的包: aura functions new 搭建一个包 cdylib, aura functions deploy 编译它然后发送它。
Cloudflare Workers:隔离 V8,另外还有 WebAssembly
Cloudflare Workers 在分布于 Cloudflare 全球网络的 V8 隔离中本机运行 JavaScript 和 TypeScript。自平台诞生以来,WebAssembly 一直是一等公民:.wasm 模块可以像任何其他模块一样直接导入到 Worker 中。
要完全用 Rust 编写 Worker,最常用的途径是社区 SDK workers-rs,它将代码编译为 wasm32-unknown-unknown 并在 Workers 运行时中执行。与 Aurabase 的 wasm 模式的区别在于可用表面积。通过此 SDK 用 Rust 编写的 Worker 在完整的 Workers 环境中运行,因此可以调用 fetch 或其他平台绑定。 Aurabase 的 wasm 模式从故意减少的主机表面开始(上一节)。
Vercel Edge Functions:Node.js 子集,没有官方 Rust 路径
Vercel 的 Edge Runtime 还使用标准 Web API 的子集(fetch、 Request/Response、 crypto.subtle...)而不是完整的 Node.js 环境在 V8 隔离中运行代码。 Native Node 模块和任意编译工具链在那里没有地位。
WebAssembly 对象是此子集的一部分:没有什么可以阻止您加载 .wasm 二进制文件并从 JavaScript 或 TypeScript 函数手动实例化它。但据我们所知,Vercel 没有发布任何官方 SDK 或 CLI 来直接用 Rust 编写 Edge Function,这与 Cloudflare 端的 workers-rs 或 Aurabase 端的 aura functions deploy 不同。该路径仍然是可能的,但完全手动,没有专用工具。
沙盒:WASM 线性内存与 V8 隔离
V8 隔离将同一引擎进程内的专用堆执行的代码与其自己的上下文分开。这是一种经过验证的机制,在 Cloudflare 和 Vercel 中每秒处理数百万个请求,但它仍然是单个 JavaScript 引擎内的软件隔离机制。
WASM 模型的隔离方式不同:每个实例都有自己的线性内存,这是一个连续的缓冲区,无法通过构建二进制格式本身进行访问,与执行它的引擎无关。在 Aurabase 运行时中,操作由来宾模块提供的指针(aura.log、 aura.get_env...)的每个主机函数都会在任何内存访问之前显式地重新验证边界。这是针对恶意或有缺陷模块的额外深度防御。
三种架构并排
| Aurabase(wasm) | Cloudflare 工人 | Vercel 边函数 | |
|---|---|---|---|
| 执行模型 | 原生 WASM 模块,Wasmtime | 隔离V8 + WASM作为可选模块 | 隔离 V8、Node.js 子集 |
| 前景中的铁锈 | 是的,专用模式+CLI | 通过社区 SDK (workers-rs) | 不,没有官方路线 |
| 退出模块的网络访问 | 没有,在代码中检查过(无网络主机功能) | 是的,通过完整的 Workers 环境 | 是的,标准获取 API |
| CPU预算 | 燃料浪费时间,可配置 | 每个请求的 CPU 时间限制(Cloudflare 文档) | 每次召唤的持续时间限制(文档 Vercel) |
| 专用 Rust 部署 | aura 功能部署(货物构建本地) | 牧马人 + 工人-rs | 没有官方等效工具 |
Aurabase 运行时规范。 Cloudflare 和 Vercel 专栏根据每个平台记录的公共架构进行了描述(隔离 V8、WebAssembly 作为构建目标)。
根据您的功能选择哪个运行时
纯计算,无网络调用:模式验证、数据转换、评分、轻量级图像生成。 Aurabase 的 wasm 模式直接适用,具有严格的内存沙箱、明确的 CPU 预算,并且不依赖于外部服务。
调用第三方 API 的函数(支付、电子邮件、传出 webhook)。 Aurabase 的 deno 模式至今仍是默认选择,就像经典的 Cloudflare Worker 或 Vercel Edge Function 本身依赖 fetch 一样。
团队已投资 Cloudflare 生态系统(KV、耐用对象、R2)。留在 Workers 是有道理的; workers-rs 允许您逐步引入 Rust,而无需更改平台。
需要一个本地 Rust 运行时管理的端到端,具有专用的 CLI 和与后端其余部分相同的语言。这是 在我们的 Wasmtime 与 Wasmer 比较中记录的关于 WebAssembly 引擎本身选择的角度。