中计算散度的函数_荷畔微风 - 在函数计算FunctionCompute中使用WebAssembly
WebAssembly 是一種新的W3C規(guī)范,無需插件可以在所有現(xiàn)代瀏覽器中實(shí)現(xiàn)近乎原生代碼的性能。同時(shí)由于 WebAssembly 運(yùn)行在輕量級(jí)的沙箱虛擬機(jī)上,在安全、可移植性上比原生進(jìn)程更加具備優(yōu)勢(shì)。同時(shí)資源消耗小、啟動(dòng)速度快的特點(diǎn)也非常適合Serverless的場(chǎng)景。開發(fā)者們開始探索WebAssembly在Serverless的應(yīng)用場(chǎng)景。
WebAssembly 101
WebAssembly (WASM) 是一種可以在Web瀏覽器上運(yùn)行的編譯語(yǔ)言(如C/C++, Rust, Go)的技術(shù)方案。WebAssembly采用二進(jìn)制字節(jié)碼格式,運(yùn)行在基于堆棧的虛擬機(jī)上。2017年2月28日,四大主流瀏覽器Chrome, Firefox, Safari和IE共同宣布 WebAssembly 的最小可行產(chǎn)品(MVP)已經(jīng)完成。
相比JavaScript, 使用WebAssembly可以更高效地在Web瀏覽器中運(yùn)行代碼邏輯。
WebAssembly作為社區(qū)標(biāo)準(zhǔn),具有良好的可移植性。WebAssembly代碼邏輯可以一致地運(yùn)行在不同瀏覽器實(shí)現(xiàn)中,并與JavaScript或?yàn)g覽器對(duì)象進(jìn)行交互調(diào)用。WebAssembly也可以運(yùn)行在非瀏覽器環(huán)境下。此外WebAssembly運(yùn)行在一個(gè)沙箱化的執(zhí)行環(huán)境中,嚴(yán)格遵守瀏覽器安全策略,具有良好的安全性。
函數(shù)計(jì)算 + WebAssembly 模塊
Function as a Service(FaaS)是Serverless Computing的重要計(jì)算形態(tài),它提供了事件驅(qū)動(dòng)的編程模型,開發(fā)者只需編寫和上傳事件響應(yīng)代碼,而平臺(tái)則會(huì)負(fù)責(zé)計(jì)算資源的彈性伸縮。
FaaS主要支持了 Node.js, Python, PHP等解釋型語(yǔ)言,也支持Java, C#等編譯型語(yǔ)言。由于在Node.js 8.0版本以后已經(jīng)內(nèi)置了WebAssembly運(yùn)行時(shí),在主流的FaaS環(huán)境可以通過Node.js實(shí)現(xiàn)調(diào)用WebAssembly模塊的能力,比如在AWS Lambda和Cloudflare Worker。
在FaaS中利用Node.js調(diào)用WebAssembly 模塊,有以下優(yōu)點(diǎn)
我們也將做一個(gè)小實(shí)驗(yàn),結(jié)合Rust和AssemblyScript兩種語(yǔ)言在阿里云函數(shù)計(jì)算(FunctionCompute, FC)場(chǎng)景中體驗(yàn)WebAssembly。
環(huán)境準(zhǔn)備
- 安裝并配置阿里云函數(shù)計(jì)算的 Serverless 應(yīng)用部署的工具 Fun
- 下載示例代碼,git clone https://github.com/denverdino/fun-wasm
- (可選) Rust環(huán)境需要安裝 wasm-pack
利用Rust構(gòu)建Serverless WebAssembly應(yīng)用
Rust是Mozilla的一個(gè)新的系統(tǒng)級(jí)編程語(yǔ)言。Mozilla同時(shí)也是WebAssembly技術(shù)最重要的推動(dòng)者,它基于WebAssembly發(fā)布了wasm-bindgen,目的提升 JavaScript 和 Rust 之間的互操作性,可以讓 Rust代碼能夠與JavaScript一起使用。
本節(jié)參考了Scott Logic的文章,我們將利用wasm-bindgen,在FunctionCompute的Node.js運(yùn)行時(shí)中運(yùn)行基于Rust編譯的WebAssembly代碼。
$ cd rust-wasm# 一個(gè)簡(jiǎn)單的Rust Hello World應(yīng)用,利用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# 簡(jiǎn)單的函數(shù)計(jì)算事件響應(yīng)代碼,在NodeJS中調(diào)用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應(yīng)用部署模板,利用HTTP Trigger進(jìn)行訪問$ 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']部署并測(cè)試
$ 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構(gòu)建Serverless WebAssembly應(yīng)用
AssemblyScript可以將一個(gè) TypeScript 嚴(yán)格的子集編譯成 WebAssembly。AssemblyScript 使用與 TypeScript 相同的語(yǔ)法,但使用了自己的標(biāo)準(zhǔn)庫(kù)來支撐 WebAssembly 的功能,這意味著開發(fā)者不必為了編寫 WebAssembly 而去學(xué)習(xí)新的編程語(yǔ)言,這是一個(gè)巨大的優(yōu)點(diǎn)。而且AssemblyScript是針對(duì)WebAssembly設(shè)計(jì)的語(yǔ)言,它可以生成更加簡(jiǎn)練的WebAssembly代碼,并更加簡(jiǎn)單地與JavaScript集成交互。
$ cd assemblyscript# 下面是一個(gè)簡(jiǎn)單的Fibonacci數(shù)列的遞歸實(shí)現(xiàn)$ 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目標(biāo)代碼$ 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總結(jié)
以上是生活随笔為你收集整理的中计算散度的函数_荷畔微风 - 在函数计算FunctionCompute中使用WebAssembly的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么看有没有安装libevent_家里有
- 下一篇: nginx nodejs环境配置_基于d