PROD欧洲主权BaaS平台打开仪表板 →

工程 · 8 最小读取值

Wasmtime 与 Wasmer 用于生产 Edge Functions

Affane Daylami · Fondateur · 2026年6月25日

返回博客

Wasmtime 和 Wasmer 是两个最常用的 WebAssembly 运行时,用于在浏览器外部、边缘或服务器端运行代码。 Aurabase 决定:其 Edge Functions 的原生 WASM 执行模式嵌入 Wasmtime,而不是 Wasmer,直接在相关服务的 Cargo.toml 中进行验证。

该英文文本是根据法文原文自动生成的,尚未经过审查。
该页面已自动翻译。英文版具有权威性。

这种选择不是外观偏好。本文比较了两个运行时的实际验证内容、治理、编译器、WASI 标准、安全模型,然后详细介绍了 Aurabase 在生产中运行的 Wasmtime 实现、燃料计量、纪元中断、内存限制,但没有提供未测量的冷启动数据。

要点

  • Wasmtime:字节码联盟项目,用 Rust 编写,Cranelift 生产编译器,Apache-2.0 许可证(LLVM 例外)。
  • Wasmer:由 Wasmer Inc. 开发的运行时,三个可互换的编译器(Singlepass、Cranelift、LLVM),MIT 许可证。
  • Aurabase 将 wasmtime = { version = "43", features = ["async", "cranelift"] } 声明为 aura-functions中的实际生产依赖项,并在 Cargo.toml中进行验证。
  • 本机 WASM 模式默认应用 64 MB 的内存上限、10 亿个单位的燃料预算和 10 秒的超时,所有三项均可通过环境变量进行调整。
  • 此 WASM 模式与 Aurabase Edge Functions(Deno 运行时)的默认模式共存:它是第二执行路径,而不是默认路径。
#
背景

两个运行时,相同的 WebAssembly 基础

WebAssembly 早已为浏览器指定了一种运行时格式。多年来,它还被用于在服务器端或边缘执行沙盒代码:字节码编译一次,可在任何主机上移植,默认情况下隔离,无需容器或完整的虚拟机。 Wasmtime 和 Wasmer 将这个扩展从浏览器中携带出来,两者都是用 Rust 编写的,都能够执行相同的 .wasm文件。

Wasmtime 是由字节码联盟托管的项目,该组织管理 WebAssembly 服务器生态系统的多个组件,包括 Cranelift 编译器。 Wasmer 由 Wasmer Inc. 开发,该公司将运行时作为开源发布,同时营销围绕其的补充服务(边缘部署、工具)。两种不同的治理模型,不对其中之一生成的代码质量进行判断。

本文的其余部分比较了四个可验证的领域:许可和治理、可用编译器、WASI 标准和组件模型、安全模型,然后通过支持代码解释为什么 Aurabase 的 Rust 核心 在其 Edge Functions 引擎中运行 Wasmtime。

#
治理和许可

多供应商基金会与商业出版商

Wasmtime 是在 Apache-2.0 许可证下发布的,LLVM 例外,这是编译器生态系统中常见的宽松许可证。其治理遵循字节码联盟模型:多个组织为该项目做出贡献,没有一个组织单独拥有该项目。

Wasmer 是在 MIT 许可下发布的,在纸面上更宽松,但其技术方向仍然集中在单一出版商 Wasmer Inc 上。这本身并不是错误:许多成功的开源项目都遵循这种模式。如果您的组织重视跨多个实体的分布式治理,这只是不同的风险状况。

#
编译器

一个后端与三个后端:Cranelift、Singlepass、LLVM

Wasmtime 通过同样来自字节码联盟的代码生成器 Cranelift 在生产中进行编译。该板条箱还记录了一个额外的编译器 Winch,与 Cranelift 相比,它旨在在对启动敏感的情况下减少编译时间。aura-functions 的 Cargo.toml 仅激活 cranelift 功能:正是这个编译器,并且单独处理生产中加载的每个 WASM 模块。

Wasmer 采取了相反的路径:三个可互换的后端。 Singlepass 几乎可以立即进行一次编译,但代价是优化程度较低的机器代码。 Cranelift 提供了一种平衡的折衷方案。 LLVM 旨在实现最佳的执行吞吐量,并具有三者中最长的编译时间。单个运行时,配置期间选择的三个折衷配置文件。

#
标准

WASI Preview 2 和组件模型

WASI(WebAssembly 系统接口)标准化了从 WASM 模块对文件、时钟和网络的访问,而不依赖于浏览器。其最新版本 WASI Preview 2 基于组件模型:一种用不同语言编写的模块组合机制,具有共享类型接口,而不是特定于每个运行时的二进制格式。 Wasmtime 和 Wasmer 都在按照各自的进度致力于实施这一标准。

Wasmer 还记录了 WASIX,这是一个扩展,旨在涵盖官方 WASI 标准尚未涵盖的 POSIX 原语,例如线程或更全面的网络套接字。这不是 WebAssembly 工作组支持的标准,而是特定于 Wasmer 生态系统的扩展。

Aurabase WASM 模式不使用什么

Aurabase 的本机 wasm 模式(在 wasm/mod.rs中验证)当前既不使用 WASI Preview 2,也不使用组件模型。这是一个自行开发的最小主机 ABI,向访客模块公开了四个功能,而不是完整的标准。 Cargo.toml 也不会激活 wasmtime板条箱上的 wasi 功能。

#
安全性

内存隔离和计时:燃料、纪元、限制

两个运行时都将每个模块隔离在其自己的线性内存中,除了显式导入的函数之外,无法直接访问主机系统。这是两个项目共有的 WebAssembly 安全模型的基础。

Wasmtime 还公开了一个本机执行片段 API,fuel:每条指令消耗预先固定的预算,一旦预算耗尽,执行就会正确停止。第二个 API,epoch中断,允许您在等待时施加超时,而不会阻塞引擎。 Wasmer 记录了他自己的计量机制和每个实例的内存限制;本文尚未在第三方存储库中验证它们,因此不会逐图分解它们。

这正是 Aurabase 的 aura-functions 服务所支持的功能,下一节将通过实际源代码详细介绍。

#
Aurabase 的选择

Wasmtime 签入代码,而不是声明的偏好

aura-functions 服务将 wasmtime 声明为生产依赖项,没有停用注释或开发依赖项配置。存储库中没有文件,无论是 Cargo.toml 还是 .rs文件,都没有提到 Wasmer。

Cargo.tomltoml
# WASM 运行时
wasmtime = { version = "43", features = ["async", "cranelift"] }

初始化代码按纪元显式激活燃料和中断,然后通过调用 StoreLimits来限制内存:

wasm/mod.rsrust
let mut cfg = Config::new();
cfg.consume_fuel(true);
cfg.epoch_interruption(true);
let engine = Engine::new(&cfg)?;

// 通过调用:
let limits = StoreLimitsBuilder::new()
    .memory_size(self.max_memory_mb as usize * 1024 * 1024)
    .build();
store.set_fuel(self.max_fuel)?;
store.epoch_deadline_async_yield_and_update(1);

所有三个限制均可根据环境变量进行配置,并在 config/mod.rs中检查默认值:WASM_MAX_MEMORY_MB 为 64,WASM_TIMEOUT_SECS 为 10,WASM_MAX_FUEL 为 10 亿单位。超时在后台触发:tokio::spawn 等待配置的持续时间,然后增加引擎纪元,而不会在等待时阻塞当前执行。

暴露给来宾模块的 ABI 故意保持最小:四个主机函数 aura.log、 aura.get_input、 aura.set_output 和 aura.get_env,通过 linker.func_wrap注册。它不是组件模型,也不是 WASI Preview 2:它是一个内部合约,范围更窄,专为一次性使用而设计,执行 HTTP 边缘函数并恢复其 JSON 响应。

此 wasm 模式是每个函数的选择,而不是全局切换。 Aurabase 架构概述 详细介绍了另一个路径,即默认的 deno模式,该模式在单独的服务中执行 JavaScript/TypeScript。两者共存于同一个 aura-functions服务中。

已验证与产品目标

这里检查的是实际的 Wasmtime 实现及其默认资源限制。没有说明冷启动数据:请参阅我们的 对 WebAssembly 冷启动 的专门分析,了解什么是可测量的,什么是尚未测量的。

#
概述

Wasmtime 和 Wasmer,肩并肩

治理字节码联盟,多组织Wasmer Inc.,商业出版商
许可证Apache-2.0,带有 LLVM 异常麻省理工学院
实现语言铁锈铁锈
编译器起重机(绞车可选,未在 Aurabase 激活)您选择的 Singlepass、Cranelift、LLVM
WASI标准WASI 预览版 2 + 组件模型WASI Preview 2 + WASIX(特定于 Wasmer 的扩展)
运行片段Fuel + 按纪元中断(已验证的本机 API)Wasmer 特有的机制,此处未验证
由 Aurabase 使用是的,aura-functions,版本 43 已固定不,没有依赖性,直接或传递

来源:来自 Aurabase 存储库的 Cargo.toml 和 wasm/mod.rs,于 2026 年 8 月 24 日直接验证。Wasmtime 和 Wasmer 的一般特征取自每个项目的公共文档;该表中没有重新发布第三方基准数据。

#
决定

谁应该选择什么

您启动一个新的边缘运行时,没有现有的依赖项。 Wasmtime 由多供应商基金会支持,降低了项目未来依赖单一发布商的风险。

您有非常频繁且短暂的冷启动。 Wasmer 的 Singlepass 后端直接响应了这种需求,几乎是即时编译,但代价是优化程度较低的机器代码。

您需要超出当前标准 WASI 的 POSIX 原语。 WASIX,Wasmer 扩展,涵盖了 WASI Preview 2 单独尚未涵盖的线程和扩展套接字。

您想要一个本机素材和超时 API,无需第三方中间件。 Wasmtime 直接在板条箱中公开 fuel 和 epoch,这正是 aura-functions 在 Aurabase 中实现的功能。

#
常见问题解答

常见问题解答

Wasmtime 比 Wasmer 快吗?+
这里没有主动说明比较性能数据。这两个运行时公开不同的编译器(Wasmtime 的 Cranelift;Wasmer 的 Singlepass、Cranelift 或 LLVM 的选择),它们响应编译速度和执行速度之间的不同权衡。请参阅我们对加密和源处理的 WebAssembly 冷启动的专门分析。
我们可以在同一个项目中使用 Wasmtime 和 Wasmer 吗?+
从技术上讲是可以的,因为两者都使用相同的 .wasm 格式。但这使集成表面积、两个主机 API、两个配置模型加倍,对大多数团队来说没有任何净收益。 Aurabase 仅发货一个,已在 aura-functions 服务的 Cargo.toml 中进行验证。
所有 Aurabase Edge 功能都在 Wasmtime 上运行吗?+
不会。Aurabase Edge Functions 的默认模式通过单独的 Deno 服务运行 JavaScript/TypeScript。 Wasm 模式由 Wasmtime 提供支持,是根据功能选择的第二执行路径,而不是默认路径。
WebAssembly 组件模型实际上提供了什么?+
组件模型标准化了用不同语言编写的 WASM 模块的组成,具有共享类型接口,而不依赖于特定于运行时的二进制格式。 Aurabase 的原生 WASM 模式如今已不再使用:它是自制的最小主机 ABI,而不是组件模型。

准备好部署了吗?

五分钟内完成您的后端。

无需信用卡 · 500 MB 免费 · 50,000 MAU