中计算散度的函数_荷畔微风 - 在函数计算FunctionCompute中使用WebAssembly
WebAssembly 是一種新的W3C規范,無需插件可以在所有現代瀏覽器中實現近乎原生代碼的性能。同時由于 WebAssembly 運行在輕量級的沙箱虛擬機上,在安全、可移植性上比原生進程更加具備優勢。同時資源消耗小、啟動速度快的特點也非常適合Serverless的場景。開發者們開始探索WebAssembly在Serverless的應用場景。
WebAssembly 101
WebAssembly (WASM) 是一種可以在Web瀏覽器上運行的編譯語言(如C/C++, Rust, Go)的技術方案。WebAssembly采用二進制字節碼格式,運行在基于堆棧的虛擬機上。2017年2月28日,四大主流瀏覽器Chrome, Firefox, Safari和IE共同宣布 WebAssembly 的最小可行產品(MVP)已經完成。
相比JavaScript, 使用WebAssembly可以更高效地在Web瀏覽器中運行代碼邏輯。
WebAssembly作為社區標準,具有良好的可移植性。WebAssembly代碼邏輯可以一致地運行在不同瀏覽器實現中,并與JavaScript或瀏覽器對象進行交互調用。WebAssembly也可以運行在非瀏覽器環境下。此外WebAssembly運行在一個沙箱化的執行環境中,嚴格遵守瀏覽器安全策略,具有良好的安全性。
函數計算 + WebAssembly 模塊
Function as a Service(FaaS)是Serverless Computing的重要計算形態,它提供了事件驅動的編程模型,開發者只需編寫和上傳事件響應代碼,而平臺則會負責計算資源的彈性伸縮。
FaaS主要支持了 Node.js, Python, PHP等解釋型語言,也支持Java, C#等編譯型語言。由于在Node.js 8.0版本以后已經內置了WebAssembly運行時,在主流的FaaS環境可以通過Node.js實現調用WebAssembly模塊的能力,比如在AWS Lambda和Cloudflare Worker。
在FaaS中利用Node.js調用WebAssembly 模塊,有以下優點
我們也將做一個小實驗,結合Rust和AssemblyScript兩種語言在阿里云函數計算(FunctionCompute, FC)場景中體驗WebAssembly。
環境準備
- 安裝并配置阿里云函數計算的 Serverless 應用部署的工具 Fun
- 下載示例代碼,git clone https://github.com/denverdino/fun-wasm
- (可選) Rust環境需要安裝 wasm-pack
利用Rust構建Serverless WebAssembly應用
Rust是Mozilla的一個新的系統級編程語言。Mozilla同時也是WebAssembly技術最重要的推動者,它基于WebAssembly發布了wasm-bindgen,目的提升 JavaScript 和 Rust 之間的互操作性,可以讓 Rust代碼能夠與JavaScript一起使用。
本節參考了Scott Logic的文章,我們將利用wasm-bindgen,在FunctionCompute的Node.js運行時中運行基于Rust編譯的WebAssembly代碼。
$ cd rust-wasm# 一個簡單的Rust Hello World應用,利用wasm_bindgen聲明與JavaScript代碼的綁定$ cat src/lib.rsuse wasm_bindgen::prelude::*;#[wasm_bindgen]pub fn hello_world() -> String { let mut string = String::new(); string.push_str("Hello, rust-wasm!"); return string;}# 編譯生成WebAssembly和NodeJS綁定$ wasm-pack build --target nodejs# 簡單的函數計算事件響應代碼,在NodeJS中調用WebAssembly邏輯$ cat index.jsconst wasm = require("./pkg/rust_wasm");var getRawBody = require('raw-body')module.exports.handler = function (request, response, context) { // get request body getRawBody(request, function (err, body) { response.setStatusCode(200); response.send(wasm.hello_world()); });}# Serverless應用部署模板,利用HTTP Trigger進行訪問$ cat template.ymlROSTemplateFormatVersion: '2015-09-01'Transform: 'Aliyun::Serverless-2018-04-03'Resources: fun: Type: 'Aliyun::Serverless::Service' rust-wasm: Type: 'Aliyun::Serverless::Function' Properties: Handler: index.handler CodeUri: ./ Description: 'http trigger demo!' Runtime: nodejs8 Events: http-test: Type: HTTP Properties: AuthType: ANONYMOUS Methods: ['GET', 'POST', 'PUT']部署并測試
$ fun deploy...Waiting for service fun to be deployed... Waiting for function rust-wasm to be deployed... Waiting for packaging function rust-wasm code... package function rust-wasm code done, the number of files you have packaged is:11 Waiting for HTTP trigger http-test to be deployed... methods: [ 'GET', 'POST', 'PUT' ] url: https://xxxxxxx.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/fun/rust-wasm/ function http-test deploy success function rust-wasm deploy successservice fun deploy success$ curl https://xxxxxxx.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/fun/rust-wasm/Hello, rust-wasm!利用AssemblyScript構建Serverless WebAssembly應用
AssemblyScript可以將一個 TypeScript 嚴格的子集編譯成 WebAssembly。AssemblyScript 使用與 TypeScript 相同的語法,但使用了自己的標準庫來支撐 WebAssembly 的功能,這意味著開發者不必為了編寫 WebAssembly 而去學習新的編程語言,這是一個巨大的優點。而且AssemblyScript是針對WebAssembly設計的語言,它可以生成更加簡練的WebAssembly代碼,并更加簡單地與JavaScript集成交互。
$ cd assemblyscript# 下面是一個簡單的Fibonacci數列的遞歸實現$ cat assembly/index.ts// The entry file of your WebAssembly module.export function fib(n: i32): i32 { let t: i32; let a: i32 = 0; let b: i32 = 1; for (let i: i32 = 0; i < n; i++) { t = a + b; a = b; b = t; } return b;}# 生成WebAsssembly目標代碼$ npm run asbuild# 如下是AssemblyScript自己生成的膠水代碼,用于加載WebAssembly模塊$ cat wasm.jsconst fs = require("fs");const compiled = new WebAssembly.Module(fs.readFileSync(__dirname + "/build/optimized.wasm"));const imports = { env: { abort(_msg, _file, line, column) { console.error("abort called at index.ts:" + line + ":" + column); } }};Object.defineProperty(module, "exports總結
以上是生活随笔為你收集整理的中计算散度的函数_荷畔微风 - 在函数计算FunctionCompute中使用WebAssembly的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么看有没有安装libevent_家里有
- 下一篇: nginx nodejs环境配置_基于d