1 什麼是WebAssembly
WebAssembly(Wasm)是一種可移植的字節碼格式,本身為了解決日益複雜的前端 Web 應用以及有限的JavaScript 腳本解釋性能而誕生的技術,通過該技術可以使用非JavaScript 編程語言編寫代碼並且能在瀏覽器上運行[1]。
隨着Wasm的發展,現在Wasm不僅僅可以用於瀏覽器,同樣可以被應用在server-side程序中,它已經被定義為一個可移植、體積小、加載快的一種通用二進制格式。其指令本身並不直接面向程序開發者,而是被設計為其他編程語言(如Rust、C++、Go)的編譯目標,可以在任何具有Wasm運行時的平台上運行。
Wasm在雲原生領域的應用生態正在蓬勃發展。Wasm程序可以像容器一樣在雲原生環境中運行,幫助開發者輕鬆地構建和部署應用程序。Wasm可以提供更高的性能,更快的啓動時間,更低的資源消耗,以及更好的可移植性,是除容器外的另一種對計算和資源的抽象方式。因此Wasm出身就符合雲原生的理念,可以很好地在雲上運行。目前圍繞Wasm相關的雲原生相關項目正在涌現。
2 為什麼需要WebAssembly
上層語言無關
其實像Wasm這種“編譯中間目標 + 跨平台執行”的思想在某些編程語言中已經存在。例如在Java語言中,開發者編寫的代碼被編譯為字節碼,再由Java虛擬機執行字節碼。不同的是,Wasm是一個通用的編譯目標,它允許開發者用任何他們熟悉的編程語言(只要支持編譯目標為Wasm,具體請參見支持的語言列表[2])來編寫Wasm程序,不需要為了開發某個功能而學習一門新的語言。同時,語言無關性意味着Wasm解鎖了各種上層語言生態的大門,使其開發過程本身就具備靈活便利的特點。
輕量級和高性能
Wasm能夠達到接近原生機器碼的運行速度,有着快速的啓動時間和很小的空間佔用。與Docker容器相比,Wasm及其運行時可以快速執行並且體積非常小,在運行時性能方面,WebAssembly 比 Docker 快 10%-50%;在啓動時間方面,Wasm比Docker快約100倍[3]。在serverless場景中,冷啓動是一個困擾已久的問題,而Wasm在這方面有着天然的優勢,因此Wasm被認為是一個解決冷啓動問題的高效運行時。
高安全性
Wasm二進制是在內存安全的隔離沙箱中執行的,它不僅比原生二進制文件更安全,而且比Docker這樣的OS級容器更安全。Wasm對系統資源的操作必須申請明確的權限[4],擁有權限後通過一系列接口與主機環境通信。通過嚴格的資源約束控制,Wasm可以安全可靠地在各種平台上運行。
Wasm這種良好的隔離性和安全性也使得其非常適合多租户的場景。這種特性正是雲計算非常需要的,因此Wasm有潛力成為除容器外的另一種計算運行時。