Featured image of post 在 Cloudflare 邊緣工作者中利用 WebAssemblyFeatured image of post 在 Cloudflare 邊緣工作者中利用 WebAssembly

在 Cloudflare 邊緣工作者中利用 WebAssembly

深入研究託管 Rust/Go WebAssembly 套裝的 Cloudflare Workers,確保零冷啟動和快速載入時間。

介紹

Cloudflare Workers 將程式碼執行帶到網路邊緣(全球 330 多個地點),徹底改變了無伺服器運算。透過將 WebAssembly (Wasm) 模組整合到 Workers 中,您可以以接近本機的速度運行運算密集任務(影像處理、加密、視訊編碼、科學運算),同時保持邊緣分佈的低延遲優勢。本文探討如何將 Rust 和 AssemblyScript 等語言編譯為 Wasm,將它們部署在 Workers 上,以及所涉及的效能權衡。


Cloudflare Worker 執行時期

Workers 在 V8 Isolates 技術上運行 - 每個請求都會獲得一個新的 JavaScript 環境,但運行時經過最佳化以重複使用預熱的隔離。主要特點:

特色詳情
執行模型每個請求單線程,透過隔離並發
冷啟動~5 毫秒(V8 快照預熱)
記憶體限制每個工人 128 MB
CPU時間限制30 秒(免費套餐為 50 毫秒)
Wasm 模組大小限制10 MB(壓縮)

與傳統的無伺服器 (AWS Lambda) 不同,Workers 透過使用使用腳本預先初始化的輕量級 V8 隔離來避免容器冷啟動。


整合 Wasm 模組

您可以將 .wasm 二進位檔案作為 ES 模組直接匯入到 Worker 腳本中:

// wrangler.toml
// name = "my-worker"
// main = "src/index.js"
// [wasm_modules]
// MODULE = "path/to/module.wasm"
// src/index.js
import wasmModule from '../path/to/module.wasm';

export default {
  async fetch(request) {
    const instance = await wasmModule();
    const result = instance.exports.myFunction(42);
    return new Response(`Result: ${result}`);
  },
};

對於 Wrangler v3+,wasm_modules 綁定自動提供實例化模組 - 您將其作為函數呼叫以取得實例。


為 Workers 將 Rust 編譯為 Wasm

Rust,透過 wasm-pack,是 Workers Wasm 最受歡迎的語言:

cargo new --lib my-rust-wasm
cd my-rust-wasm
// src/lib.rs
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn heavy_compute(input: u32) -> u32 {
    // CPU-intensive operation
    (0..input).fold(0, |acc, i| acc + i * i)
}
wasm-pack build --target web

然後在 wrangler.toml 中引用產生的 .wasm 檔案:

[wasm_modules]
RUST_MODULE = "pkg/my_rust_wasm_bg.wasm"

AssemblyScript 替代方案

// assembly/index.ts
export function heavyCompute(n: u32): u32 {
  let sum: u32 = 0;
  for (let i: u32 = 0; i < n; i++) {
    sum += i * i;
  }
  return sum;
}

AssemblyScript 直接編譯為 Wasm,不需要 Rust 的工具鏈,這對 TypeScript 開發人員很有吸引力。


性能優勢

Wasm 擅長處理 JavaScript 中速度較慢的運算密集任務:

運作JS(毫秒)Wasm(毫秒)加速
SHA-256 哈希 (1 MB)〜45〜85.6×
影像調整大小(4K → 高清)〜120〜225.5×
斐波那契(45)〜8,500〜9508.9×
JSON 解析 (2 MB)〜15〜111.4×

對於 I/O 密集型操作(獲取、KV 讀取、API 呼叫),Wasm 的效能並沒有明顯優於 JS——瓶頸在於網路延遲,而不是 CPU。


冷啟動注意事項

由於 V8 分離株已預熱,工作人員可實現近乎零的冷啟動。然而,Wasm 編譯為冷隔離的第一個請求增加了 ~200–500 µs。與傳統容器冷啟動(秒)相比,這可以忽略不計。 V8 引擎快取已編譯的 Wasm 程式碼,因此同一隔離上的後續請求會跳過編譯。

要最小化初始延遲:

  • 將 Wasm 二進位檔案保持在 1 MB 以下
  • 使用流實例化
  • 在頂層範圍內預先實例化模組(單例模式)
const instance = await wasmModule(); // Instantiate once at top level

export default {
  async fetch(request) {
    return new Response(instance.exports.process(request.url));
  },
};

與工人數據服務集成

Wasm 模組可以存取 Workers 生態系綁定:

// Access Workers KV from Rust Wasm
#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_namespace = console)]
    fn log(s: &str);
}

來自 JavaScript:

const instance = await wasmModule();
const value = await env.KV_NAMESPACE.get('key');
const result = instance.exports.transform(value);

結論

Cloudflare Workers 與 WebAssembly 結合,支援新型邊緣應用程式 - 以前需要專用伺服器的運算密集型任務現在可以在邊緣運行,並具有接近本機的效能。 V8 隔離的零冷啟動模型消除了 Wasm 在無伺服器環境中的主要缺點。對於加密、壓縮、影像處理和複雜資料轉換等 CPU 密集型操作,Wasm on Workers 是一種引人注目的架構,可平衡低延遲、全球分佈和原始運算能力。