當前位置:
首頁 > 科技 > 當 WebAssembly 遇上 Serverless

當 WebAssembly 遇上 Serverless

導讀:WebAssembly是一種新的適合於編譯到Web的,可移植的,大小和載入時間高效的格式,邊緣計算是方興未艾的人們技術領域。本文介紹了如何使用WebAssembly作為邊緣計算容器,對於提高邊緣計算效率,降低運行開銷有很大意義,十分值得架構師一讀。

Lucet是Fastly開源的WebAssembly編譯器和運行時。WebAssembly旨在使Web瀏覽器能夠以接近本機的速度安全地執行程序。自2017年初以來,WebAssembly已經得到4大瀏覽器支持。

Lucet旨在將WebAssembly置於瀏覽器之外,並構建一個平台,以便在Fastly的邊緣雲上實現更快,更安全的執行。 很多語言已經支持WebAssembly,包括Rust,TypeScript,C和C++ ,其他語言的支持也在開發中。Fastly 計劃在其邊緣雲上提供基於Lucet的WebAssembly支持。

Lucet的一個主要設計要求是能夠為Fastly每個請求啟動單獨的實例。 這意味著在單個進程中為每秒創建數萬個WebAssembly實例,與使用瀏覽器JavaScript引擎相比,這需要大大降低運行時佔用空間。 Lucet可以在50微秒內實例化WebAssembly模塊,只需幾KB的內存開銷。 相比之下,Chromium的V8引擎需要大約5毫秒和幾十MB的內存開銷來實例化JavaScript或WebAssembly程序。

使用Lucet,Fastly的邊緣雲可以在同一進程中執行數萬個WebAssembly程序,而不會影響安全性。 Lucet編譯器和運行時協同工作以確保每個WebAssembly程序僅允許訪問其自己的資源。 這意味著開發者可以使用通用語言編寫程序,不會影響始安全性。

Lucet將執行WebAssembly的拆分為兩個組件:編譯器,它將WebAssembly模塊編譯為本機代碼,運行時,管理資源和捕獲運行時故障。 Lucet是為WebAssembly AOT編譯而設計,與瀏覽器引擎中使用的JIT策略相比,它大大簡化了運行時的設計和開銷。

Lucet構建於Cranelift代碼生成器之上。 Cranelift項目由Mozilla創建,是用於Firefox的WebAssembly和JavaScript JIT引擎。Lucet支持WebAssembly系統介面(WASI),這是一種新的標準,用於將低級介面(比如文件系統,網路和其他系統設施)安全地暴露給WebAssembly程序。 Lucet團隊與Mozilla及其他人就該系統介面的設計,實現和標準化進行了合作。Lucet早期版本使用C實現,現在的版本使用Rust實現。

組件介紹lucetc

lucetc 是lucet的編譯器。用於將WebAssembly模塊(.wasmor .wat文件)編譯為本地代碼 (.oor .so文件)。

lucet-runtime

lucet-runtime是lucetc編譯後的WebAssembly模塊的運行時。 它是一個Rust crate,它實現了從共享對象文件載入模塊,實例化它們以及調用導出的WebAssembly函數的功能。 lucet-runtime提供管理WebAssembly實例使用的資源和檢測非法操作並從中恢復的異常機制這兩大功能。

大部分功能是在lucet-runtime-internals中定義的。 公共API在lucet-runtime中。 測試套件在lucet-runtime-tests中定義。 其中許多測試都會調用lucetc和wasi-sdk工具。

lucet-runtime可用作Rust crate或C庫。 可以在lucet-runtime/include/lucet.h中找到C語言介面。

lucet-wasi

lucet-wasi為WebAssembly提供系統介面(WASI)運行時支持。 它可以用作庫來支持另一個應用程序中的WASI,或者作為可執行文件lucet-wasi來執行通過lucetc編譯的WASI程序。

關於其他組件,可以參考Lucet項目的官方文檔。

Demo

首先,從GitHub克隆Lucet 代碼倉庫:

git clone --recurse-submodules https://github.com/fastly/lucet

README 包含有關使用Docker設置開發環境的說明。 如果您已安裝Docker,則只需一步就能搞定。

$ cd lucet $ source devenv_setenv.sh

現在,讓我們創建一個C程序,並使用Clang將其編譯為WebAssembly:

$ mkdir demo$ cd demo$ cat > hello.c <<EOT

#include <stdio.h>int main(int argc, char* argv[]){ if (argc > 1) { printf("Hello from Lucet, %s!
", argv[1]);
} else { puts("Hello, world!"); } return 0;}EOT$ wasm32-unknown-wasi-clang hello.c -o hello.wasm

使用的Lucet編譯器將WebAssembly編譯為local代碼:

$ lucetc-wasi hello.wasm -o hello.so

使用的Lucet運行時執行本機代碼:

$ lucet-wasi hello.so Hello, world! $ lucet-wasi hello.so world Hello from Lucet, world!

Lucet代碼庫中也提供了文檔和其他示例。

開源Lucet,使得WebAssembly在Web瀏覽器和邊緣雲之外的有更多的場景。 Lucet對WASI的支持是向WebAssembly計劃邁出的一大步,這些程序可以在用戶想要的任何平台上運行 ,也許在雲端,也許在邊緣節點,瀏覽器或自己的筆記本電腦或智能手機上 - 同時保持同樣強大保證安全性。 Lucet希望使WebAssembly能夠在任何允許編寫腳本或擴展的程序中茁壯成長,同時比基於動態語言,解釋器和JIT編譯器等的解決方案可以消耗更少的資源。

原文地址:https://www.fastly.com/blog/announcing-lucet-fastly-native-webassembly-compiler-runtime

https://github.com/fastly/lucet

參考閱讀:

  • 5分鐘了解Java 12 八大新特性

  • 主流微服務註冊中心淺析和對比

  • 一圖了解Google工具棧

  • Facebook F4架構解讀:千億級圖片存儲Haystack的演進

  • 被視為代替Kafka的消息隊列:Apache Pulsar設計簡介

  • 調研Redis高可用兩種方案

本文綜合兩篇英文文章編譯,由方圓翻譯。轉載本文請註明出處,歡迎更多小夥伴加入翻譯及投稿文章的行列,詳情請戳公眾號菜單「聯繫我們」。

GIAC全球互聯網架構大會深圳站將於2019年6月舉行,屆時有WebAssembly和邊緣計算相關演講。參加2019年GIAC深圳站,可以了解業界動態,和業界專家近距離接觸。

當 WebAssembly 遇上 Serverless

當 WebAssembly 遇上 Serverless

當 WebAssembly 遇上 Serverless

參加 GIAC,盤點2019年最新技術,目前購買8折優惠,多人購買有更多優惠。識別二維碼了解大會更多詳情。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 高可用架構 的精彩文章:

調研Redis高可用兩種方案

TAG:高可用架構 |