介紹
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 | 〜8 | 5.6× |
| 影像調整大小(4K → 高清) | 〜120 | 〜22 | 5.5× |
| 斐波那契(45) | 〜8,500 | 〜950 | 8.9× |
| JSON 解析 (2 MB) | 〜15 | 〜11 | 1.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 是一種引人注目的架構,可平衡低延遲、全球分佈和原始運算能力。

