跳转至

WebAssembly 在边缘计算与 IoT — 从树莓派到 300 个边缘节点

1. 这一章讲什么

第 8 章把 Wasm 放进了一台服务器,这一章把它撒出去——撒到两类更远的地方: 资源受限的 IoT 设备(传感器、网关、树莓派)和全球分布的边缘平台(Cloudflare、Fastly)。 核心论点一句话:边缘和 IoT 的四个老问题(延迟、带宽、异构硬件、安全), 正好被 Wasm 的四个特性(近原生性能、跨架构可移植、轻量、沙箱)逐一接住。1

2. 顶层全景

  往下:IoT 设备与边缘网关
      写逻辑(Rust/C)→ 交叉编译 wasm32-wasi → wasm-opt 压体积
      → 设备上装运行时(Wasmtime / WAMR)→ 跑模块、接传感器
      │
  往外:全球边缘平台
      Rust 编译 .wasm → wrangler / fastly CLI 一条命令发布
      → 部署到全球数百个节点,请求就近执行
      │
  横着:协议与安全
      MQTT(发布订阅)/ CoAP(轻量)/ OPC UA(工业)
      能力制安全 + 模块签名 + 运行时监控

图说:三条线共用同一个 .wasm 产物——这是一章的题眼。

3. 核心原理

3.1 边缘与 IoT 为什么难,Wasm 接住了什么

边缘计算是把算力挪到离数据产生地最近的地方(设备、网关、本地服务器), 而不是全送中央云。IoT 是传感器、执行器、家电、车辆这张物理设备的互联网。 书里的「为什么重要」五条:低延迟、省带宽、断网也能干活、分布式可扩展、数据不出本地(隐私); 「难在哪」四条:算力有限、硬件五花八门(ARM/x86/RISC-V、Linux/RTOS/裸机)、 分布式安全难、部署管理复杂。2

Wasm 的六张牌对上去:近原生性能(设备上跑 ML 推理)、一份二进制跨所有架构 、沙箱隔离(多租户、不可信代码)、运行时极小(内存受限设备装得下)、多语言、 执行时间可预测(实时系统的命根子)。3

3.2 设备侧部署:五步,加一个完整的树莓派走查

部署五步走:4

  1. 用 Rust/C 写逻辑;
  2. 交叉编译:rustup target add wasm32-wasi,cargo build --target wasm32-wasi --release;
  3. 压体积:wasm-opt -O3 或 twiggy(体积剖析器,告诉你哪段代码占地方);
  4. 设备上装运行时——按资源选:WAMR(WebAssembly Micro Runtime)给深度嵌入式, Wasmtime/Wasmer 给网关级;
  5. 跑:wasmtime run module.wasm。

树莓派温度过滤器的完整走查(书里的例子,输入输出都是原书的):5

#[no_mangle]
pub extern "C" fn filter_temp(temp: f32) -> f32 {
    if temp > 100.0 || temp < -40.0 { -1.0 }  // 非法读数
    else { temp }                              // 合法读数
}
rustup target add wasm32-wasi
cargo build --target wasm32-wasi --release
wasm-opt -O3 target/wasm32-wasi/release/filter_temp.wasm -o filter_temp_optimized.wasm
# 拷到树莓派,装 wasmtime,然后:
wasmtime run filter_temp_optimized.wasm --invoke filter_temp 25.5
# 输出:25.5

传 25.5 原样返回;传 150 会拿到 -1.0。这个「传感器数据本地过滤、不用事事问云」的 小闭环,是整个边缘 Wasm 的缩影。6

3.3 平台侧:Cloudflare Workers 与 Fastly Compute@Edge

Cloudflare Workers:serverless 平台,Wasm 跑在全球 300+ 边缘节点, 请求就近执行。流程:Rust 编译 .wasm → Worker 脚本里 import → wrangler generate / wrangler publish 发布。书里的数据校验例子:validate_data(75) 合法返回 75, 越界返回 -1。7

Fastly Compute@Edge:以 Wasm 为一等公民的边缘平台,早年自研 Lucet 编译器, 提供 Rust/AssemblyScript/JS 的 SDK。例子里 Rust 函数收 Request、返回 Response, fastly compute publish 一条命令上线。8

其他名字认一下就行:Fermyon Spin(Wasm 微服务框架,HTTP/Redis)、 WasmEdge(云原生 + AI 负载,带 TensorFlow/OpenCV 扩展)、Suborbital(可嵌入 运行时)、WAMR(超受限设备)。9

3.4 安全:能力制是主轴

边缘设备暴露在物理环境里,安全清单七条,核心第一条:能力制安全—— 用 WASI 把模块的资源访问精确到「只读这个传感器」,不给就不存在; 配套:内存安全语言( Rust)、沙箱隔离、出入数据消毒、模块签名(执行前验真伪)、 运行时监控(Wasmtime profiling / WasmEdge 可观测)、加密分发(更新包防篡改)。10

固件更新是个漂亮的用法:给设备推一个 .wasm 就更新了业务逻辑—— 可移植、签名可验、能力可限,比推原生二进制文明得多。书里点名的例: 智能电表接收 Wasm 模块更新它的数据聚合逻辑。11

3.5 面向受限环境的优化

和第 5 章通用优化互补,这里多三招:AOT 编译(用 WasmEdge 把 .wasm 预编译成机器码,启动更快——边缘函数冷启动是分秒必争的)、固定缓冲 (临时缓冲用 &[u8] 而不是 Vec<u8>,避免动态分配)、twiggy 找体积元凶。 wasm-opt、SIMD、流式照旧。12

3.6 主线例子:温室网关 + MQTT(书里的完整应用)

场景:树莓派做边缘网关,收集温湿度,过滤异常读数,合法的上报 MQTT broker 供云端分析。 (MQTT 是物联网最常用的发布-订阅协议——协议就是双方约好的通信格式:设备往「主题」发消息,订阅了这个主题的人收。)13

第 1 步:过滤模块(Rust,原书代码)。 filter_sensor(temp, humidity): 温度出 -20~50°C 或湿度出 0~100% 任一条,返回 0(非法);否则返回 1(合法)。14

第 2 步:编译。 wasm32-wasi + release + wasm-opt -O3,出 sensor_filter_optimized.wasm。15

第 3 步:网关脚本(Node.js + mqtt 包,原书代码)。 连上公共 broker (mqtt://broker.hivemq.com),每个读数:读 Wasm 文件 → WASI 实例化 → filter_sensor(temp, humidity) → 合法就 client.publish('greenhouse/sensor', JSON.stringify({temp, humidity}))。 模拟传感器每 5 秒造一个读数。16

第 4 步:看输出(原书实测样例)。 17

Connected to the MQTT broker
Published: Temp=25.3, Humidity=65.2      ← 合法,上报
Invalid data: Temp=55.1, Humidity=110.3  ← 温度越界 + 湿度越界,本地拦截
Published: Temp=22.7, Humidity=70.8

第 5 步:体会这一例的账。 越界读数死在本地,不占带宽、不脏云端数据—— 边缘计算「省带宽 + 隐私」两条收益,一个 if 就兑现了。18

3.7 协议与生态全景

三种 IoT 协议各配一个 Wasm 用法:MQTT(Rust paho-mqtt 编译进 WAMR 做网关)、 CoAP(给受限设备设计的轻量协议;Rust coap + lz4_flex 压数据再走 CoAP, 书里给了 compress_data 的完整 Rust + Node 互操作代码,含 Box::into_raw 传出指针、 JS 侧 malloc/读回/free 两边配对)、OPC UA(工业自动化,opcua crate + Wasmtime)。19

生态按四类认名字:语言(Rust/C/C++/AssemblyScript/Go 实验性)、运行时(上表)、 框架(Spin/WasmCloud/Suborbital)、优化工具(wasm-opt/twiggy/wasm2wat)。20

趋势五条:WASI 标准化(WASI 2.0 扩能力)、边缘 AI(TensorFlow/ONNX 接运行时)、 WebGPU(硬件加速)、5G 低延迟放大边缘价值、零信任安全模型里沙箱当基础设施。21

4. 作者的判断与证据

  • 「一份 Wasm 跨 ARM/x86/RISC-V」:这是 Wasm 最核心的承诺,机制上成立; 但「裸机(bare metal)」运行 Wasm 需要自带运行时,书里轻描淡写(补充,不在书里:裸机场景通常靠 WAMR 这类可裁剪到几十 KB 的运行时);
  • Cloudflare「300+ 边缘节点」:数字随时间涨,属转述官方宣传,量级可信;
  • 「Wasm 将成为下一代边缘与 IoT 的骨干」(结论):预测,不是事实。

判断(我们的,不是书里的): 本章的平台部分(Workers/Fastly)是全书时效性最短的—— 边缘平台的 API、CLI、甚至商业模式一年一变,书里的 wrangler 命令和 Fastly SDK 样例 会很快陈旧。真正保值的是判断框架:边缘场景选 Wasm 的判据 (代码要撒到上百个节点吗?设备异构吗?要跑不可信代码吗?——三个有一个是,Wasm 就该在候选名单上)。 如果错,会错在: 如果容器/微型虚拟机(如 Firecracker)的冷启动速度继续逼近 Wasm, 而 Wasm 的工具链进步放缓,候选名单的排序会反转——但截至本书时间坐标,Wasm 在 「多租户 + 毫秒冷启动 + 多语言」这个组合上仍无对手。

5. 边界与局限

  • 设备侧的真实约束没量化:树莓派跑 Wasmtime 的内存/CPU 开销、WAMR 最小体积, 全书没有实测表;
  • MQTT 例子的 Wasm 复用问题:网关脚本每次读数都重新 readFileSync + 实例化一遍 (原书代码如此),和第 8 章「缓存实例」的最佳实践自相矛盾,书里没点破;
  • 边缘平台只讲了幸福路径:冷启动配额、CPU 时间限制、调试可观测性等平台约束未提;
  • WebGPU 与 Wasm 的关系只在趋势里一句话带过。

6. 可带走的

  1. 边缘/IoT 选 Wasm 的三问:要撒到很多节点吗?硬件杂吗?要跑不可信代码吗?
  2. 设备侧五步:写 → wasm32-wasi 交叉编译 → wasm-opt/twiggy 压 → 装运行时 → 跑。
  3. 运行时按资源选:WAMR 给深度嵌入式,Wasmtime/Wasmer 给网关,WasmEdge 给云原生/AI。
  4. Cloudflare 流程:Rust → .wasm → Worker import → wrangler publish;300+ 节点就近执行。
  5. 边缘安全的题眼是能力制:preopens 式「不预开就没有」,模块签名 + 加密分发做更新。
  6. 「推个 .wasm 就当固件更新」是 IoT 运维的文明化方向。
  7. 受限环境三招:AOT 预编译、固定缓冲免动态分配、twiggy 找体积元凶。
  8. MQTT 三件套:broker 连接、主题发布、本地过滤后再发;越界数据死在边缘,带宽和数据质量双赚。
  9. CoAP 场景记住 lz4 压缩走查:Box::into_raw 出指针、JS 侧配对 free。
  10. 平台命令会过期,机制(就近执行、冷启动、能力沙箱)不会。

7. 原文地图

主题 原书章 原文位置
边缘/IoT 定义与五收益 WebAssembly for Edge Computing and IoT text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:59(搜「distributed computing paradigm」) · text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:73(搜「Low Latency」)
Wasm 六张牌 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:109(搜「Near-Native Performance」)
部署五步与运行时选择 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:139(搜「Wasm-Compatible Runtime」)
树莓派温度过滤走查 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:221(搜「filter_temp」) · text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:273(搜「--invoke filter_temp 25.5」)
Cloudflare Workers 流程 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:367(搜「300 global edge locations」) · text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:465(搜「wrangler publish」)
Fastly 与其他平台 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:471(搜「Fastly Compute@Edge」) · text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:523(搜「Fermyon Spin」)
安全七条 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:543(搜「Capability-Based Security」) · text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:561(搜「Module Signing」)
固件更新用法 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:341(搜「Secure Firmware Updates」)
受限环境优化 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:577(搜「Minimize Binary Size」) · text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:641(搜「Ahead-of-Time (AOT)」)
温室 MQTT 走查 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:677(搜「filter_sensor」) · text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:809(搜「Published: Temp=25.3」)
CoAP 压缩走查 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:887(搜「compress_data」)
协议三件套与生态 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:823(搜「MQTT Integration」) · text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:977(搜「Runtimes」)
未来趋势 同上 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:1031(搜「evolving rapidly」)

  1. 出处:「WebAssembly for Edge Computing and IoT」第 13–25 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:13,搜「convergence of WebAssembly」)。 ↩

  2. 出处:「WebAssembly for Edge Computing and IoT」第 55–103 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:59,搜「distributed computing paradigm」)与 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:73(搜「Low Latency」)。 ↩

  3. 出处:「WebAssembly for Edge Computing and IoT」第 105–131 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:109,搜「Near-Native Performance」)。 ↩

  4. 出处:「WebAssembly for Edge Computing and IoT」第 133–205 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:163,搜「Steps to Deploy」)。 ↩

  5. 出处:「WebAssembly for Edge Computing and IoT」第 207–279 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:221,搜「filter_temp」)。 ↩

  6. 出处:「WebAssembly for Edge Computing and IoT」第 273–279 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:273,搜「--invoke filter_temp 25.5」)。 ↩

  7. 出处:「WebAssembly for Edge Computing and IoT」第 365–467 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:367,搜「300 global edge locations」)与 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:465(搜「wrangler publish」)。 ↩

  8. 出处:「WebAssembly for Edge Computing and IoT」第 469–519 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:477,搜「Lucet」)。 ↩

  9. 出处:「WebAssembly for Edge Computing and IoT」第 521–537 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:535(搜「WAMR」)。 ↩

  10. 出处:「WebAssembly for Edge Computing and IoT」第 539–571 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:543,搜「Capability-Based Security」)。 ↩

  11. 出处:「WebAssembly for Edge Computing and IoT」第 341–351 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:347,搜「smart meter」)。 ↩

  12. 出处:「WebAssembly for Edge Computing and IoT」第 573–655 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:641,搜「Ahead-of-Time (AOT)」)。 ↩

  13. 出处:「WebAssembly for Edge Computing and IoT」第 657–665 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:659,搜「environmental sensor gateway」)。 ↩

  14. 出处:「WebAssembly for Edge Computing and IoT」第 667–693 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:677,搜「filter_sensor」)。 ↩

  15. 出处:「WebAssembly for Edge Computing and IoT」第 695–703 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:703,搜「sensor_filter_optimized.wasm」)。 ↩

  16. 出处:「WebAssembly for Edge Computing and IoT」第 705–785 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:737,搜「broker.hivemq.com」)与 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:759(搜「greenhouse/sensor」)。 ↩

  17. 出处:「WebAssembly for Edge Computing and IoT」第 805–815 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:809,搜「Temp=25.3」)。 ↩

  18. 出处:「WebAssembly for Edge Computing and IoT」第 815 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:815,搜「reducing cloud bandwidth」)。 ↩

  19. 出处:「WebAssembly for Edge Computing and IoT」第 817–937 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:887,搜「compress_data」)与 text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:895(搜「Box::into_raw」)。 ↩

  20. 出处:「WebAssembly for Edge Computing and IoT」第 939–1027 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:977,搜「Runtimes」)。 ↩

  21. 出处:「WebAssembly for Edge Computing and IoT」第 1029–1051 段(text/20-fm-ultimate-webassembly-for-high-performance-apps-b.txt:1033,搜「WASI Standardization」)。 ↩