当 WebAssembly 遇上 Serverless

2019 年 5 月 17 日 高可用架构

导读: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!\n", 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


参考阅读:



本文综合两篇英文文章编译,由方圆翻译。转载本文请注明出处,欢迎更多小伙伴加入翻译及投稿文章的行列,详情请戳公众号菜单「联系我们」。


GIAC全球互联网架构大会深圳站将于2019年6月举行,届时有WebAssembly和边缘计算相关演讲。参加2019年GIAC深圳站,可以了解业界动态,和业界专家近距离接触。


参加 GIAC,盘点2019年最新技术,目前购买8折优惠 ,多人购买有更多优惠。识别二维码了解大会更多详情。

登录查看更多
4

相关内容

LESS 是一个开源的样式语言,受到 Sass 的影响。严格来说,LESS 是一个嵌套的元语言,符合语法规范的 CSS 语句也是符合规范的 Less 代码。
【干货书】现代数据平台架构,636页pdf
专知会员服务
253+阅读 · 2020年6月15日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
234+阅读 · 2020年5月21日
【北京大学】面向5G的命名数据网络物联网研究综述
专知会员服务
37+阅读 · 2020年4月26日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
【白皮书】“物联网+区块链”应用与发展白皮书-2019
专知会员服务
93+阅读 · 2019年11月13日
微信小程序支持webP的WebAssembly方案
前端之巅
19+阅读 · 2019年8月14日
2020年你应该知道的8种前端JavaScript趋势和工具
前端之巅
5+阅读 · 2019年6月9日
工行基于MySQL构建分布式架构的转型之路
炼数成金订阅号
15+阅读 · 2019年5月16日
专访阿里亚顿:Serverless与BFF与前端
前端之巅
45+阅读 · 2019年5月8日
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
Kong 1.1 带来声明式配置与无数据库部署模式
开源中国
8+阅读 · 2019年3月28日
WebAssembly在QQ邮箱中的一次实践
IMWeb前端社区
13+阅读 · 2018年12月19日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
微软发布Visual Studio Tools for AI
AI前线
4+阅读 · 2017年11月20日
Arxiv
35+阅读 · 2019年11月7日
Arxiv
15+阅读 · 2019年4月4日
Arxiv
3+阅读 · 2018年3月29日
VIP会员
相关资讯
微信小程序支持webP的WebAssembly方案
前端之巅
19+阅读 · 2019年8月14日
2020年你应该知道的8种前端JavaScript趋势和工具
前端之巅
5+阅读 · 2019年6月9日
工行基于MySQL构建分布式架构的转型之路
炼数成金订阅号
15+阅读 · 2019年5月16日
专访阿里亚顿:Serverless与BFF与前端
前端之巅
45+阅读 · 2019年5月8日
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
Kong 1.1 带来声明式配置与无数据库部署模式
开源中国
8+阅读 · 2019年3月28日
WebAssembly在QQ邮箱中的一次实践
IMWeb前端社区
13+阅读 · 2018年12月19日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
微软发布Visual Studio Tools for AI
AI前线
4+阅读 · 2017年11月20日
Top
微信扫码咨询专知VIP会员