首页 360正文

“WebAssembly 将会取代 Docker”,但还有后半句

admin 360 2021-09-19 200 0
Wrapper_q1J1i">

出品|开源中国

文|lola_chen

WebAssembly(Wasm)是由 Mozilla 、谷歌、微软、苹果等公司合作研发的二进制指令格式语言,最初是为浏览器设计的,具有内存安全、可移植等特性。

2019年12月5日,W3C 正式宣布 WebAssembly 成为继 HTML、CSS 和 Javascipt 之后的第四大标准Web语言。这是 WebAssembly 在前端的高光时刻。

同样是2019年,Mozilla、Fastly、Intel 与 Red Hat 宣布成立联合组织 Bytecode Alliance(字节码联盟),希望通过协作实施标准和提出新标准,以完善 WebAssembly 在浏览器之外的生态。

随后,WebAssembly 在后端走得越来越远。Docker 联合创始人 Solomon Hykes 在一条著名 tweet 里表示,如果 Wasm + WASI 在 2008年就存在了,就没有必要创建 Docker 了。

一时喧哗,关于 Wasm 会不会取代 Docker 的讨论不在少数,大多观点认为,相比 Docker,Wasm 的确具有更快更轻等优越性。但实际上,Solomon Hykes 的这条推文却有后半句没说完(往下看)。

那么,Wasm 会取代 Docker 吗?经过几年发展,WebAssembly 又发展到了何种地步?开源中国有幸专访了 WasmEdge 项目的发起人 Michael Yuan ,作为全球范围内首个被 CNCF 纳入托管的开源 WebAssembly runtime 项目,WasmEdge 在近期发布了 WasmEdge 0.8.2全新版本,并且还将发布新功能,让 K8S 能够直接接入。

沿袭Java发展路径

OSCHINA:请自我介绍一下。

Michael: 大家好,我叫 Michael Yuan, 是开源老兵。 我并不是计算机专业出身,从本科到博士,我都是学天体物理的。我博士毕业后,就参与到开源的世界。那时候,微软还在将开源视为社会毒瘤。

我从 Java 开始做起,参与创建了服务端 Java 公司叫 JBoss,这是第一个用开源的方法做 Java 中间件的公司,也是第一个真正找到商业模式的开源公司。后来 JBoss 被红帽软件收购了。然后我就一直留在了开源行业。

我现在的身份是 CNCF 沙箱项目 WasmEdge 的发起人与 Maintainer,同时也是 Second State 的创始人,Second State 开发和商业化 WebAssembly 和 Rust 生态系统中的企业应用。

OSCHINA:您获得天体物理学博士学位是我们意想不到的,是怎样的契机使您接触到WebAssembly的呢?您见证了WebAssembly怎样的变迁?

Michael: 其实当时开源行业的人很多都不是计算机专业毕业的。在那个年代,找不到工作的人才去做开源的。我们做 Jboss 的时候,公司里有不少物理博士,包括当时的 CEO 与 CTO 都是物理博士。

从 Java 到今天,后端技术的发展就是不停地重新发明轮子(也可以说是“螺旋式上升”)。 年轻的开发者总是从前端开始职业生涯,过了一段时间后,曾经是前端的开发转到后端,他们遇到的第一个问题就是这个东西怎么这么复杂?我就要写一个网页再加上数据库,为什么要学习这么复杂的分布式计算框架?所以他们就会重新发明轮子,这在后端的历史上发生了三次。

第一次就是 Java。Java 以前是为了浏览器发明的。现在,我们已经知道 Java 完全是一个后端的语言。2000年左右,也是我当时在 JBoss 创业的时候,抓住了 Java 从浏览器端向服务端转变的红利。这个时候,大家对 Java 的看法是什么呢?和其他后端开发框架相比,Java 的优势是简洁和易懂,写的程序安全可移植。

第二次则是 JavaScript。到了2010年,绝大部分新来的开发者对 Java 的感觉就是太复杂了,于是就有了 JavaScript 从前端转变成后端,有了 Node.js,所以现在大部分后端技术都是用 JavaScript 开发的。Node.js 当时主要的优势是简单,开发效率高。

时间来到2020年,也是我们创建 WasmEdge 这个开源项目的时候。这个时候,大家对 Node.js 的抱怨是太复杂了。npm install 一下,安装几百个安装包,都不知道安装了什么东西。我们看见的新一代开发范式是 Serverless 与微服务。把每个业务单元做小做简单,解耦业务与基础架构,从而让开发与运维都简化。

也正因为此,目前的“大前端”、Jamstack、“前端的后端”等创新都在大量使用 Serverless。而后端的服务网格、云原生,则在使用容器化微服务。Serverless 与微服务都需要比 Docker 更轻更快的安全运行沙盒。WebAssembly 开始从前端走向后端。

和 Java 当年的发展路径很像。Java Applet 最初是为了在浏览器玩游戏,是为了在浏览器内提高性能,但是20年来,有一件事一直没有变过:大家不喜欢在浏览器玩游戏。所以虽然在浏览器市场占有率很高,但是WebAssembly 在前端的发展并不成功。我们看不到几个 WebAssembly 在浏览器的案例,就像我们今天在浏览器看不到几个用 Java 的程序一样。

但是 WebAssembly 有一个非常成功的地方。因为浏览器是互联网大厂的游戏,所以要在浏览器里行成标准,必须要有全行业的共识。WebAssembly 不但后面有 Google、Apple、Mozilla、微软这样的大厂,而且还有 W3C 这样的组织。

这就造成了 WebAssembly 可以像当年的 Java 一样做出一个强大的生态。具体的例子,比如 GCC 、LLVM 等编译器支持把各种高级语言编译成 Wasm 字节码。这种生态的支持程度,不是任何一个独立的大厂或者组织能够独立做到的。这也是 WebAssembly 放到服务器端有巨大生命力的原因。

虽然在前端没有现象级的应用,但是WebAssembly 实现了标准化。这是别的技术很难去和 WebAssembly 竞争的地方。所以,WebAssembly 有很大前景变成一个通用的计算执行环境或者容器,不仅会放在云端,也会用在边缘设备上。

成为服务网格里的“一等公民”

OSCHINA:WasmEdge 0.8.2全新版本有哪些功能更新?跨平台能力提升、增加了golang sdk的支持等,都是WasmEdge在兼容性上所作的努力,是否可以认为WasmEdge目前最紧迫的问题是兼容性问题?

Michael:

WasmEdge 0.8.2 的功能更新主要是:

  • 更好的跨平台兼容性。开发者可以在 Mac OS X(Intel 和 M1)、Windows 10 以及配备 ARM 32 位芯片的 IoT 设备上运行 WasmEdge 应用程序。

  • Networking 支持。WasmEdge 应用程序发出网络请求并运行 HTTP 服务器。

  • 新的以及一些改进的 API。在 C、Rust 和 Golang 应用程序中嵌入 WasmEdge 函数。

  • WasmEdge 的 AoT 编译器的通用二进制输出。利用云原生平台中的 AOT 性能增进。

  • 支持 proxy-wasm 标准。

讲到兼容性,其实有两个方面:

一个是 WebAssembly 里面运行什么,比如能不能运行 JavaScript,还是必须依赖编译型的语言(Rust、C/C++、Swift 等)。这个我们走的路是全面支持 JavaScript 与 DSL 。

另外一个是 WebAssembly 能够在什么环境里运行。这方面,我们有不同的语言的 SDK,比如 Golang、C 与 Rust,支持 k8s 等等。

所以我不认为这是一个兼容性问题,是生态问题。虽然 WebAssembly 在前端进行了标准化,有编译器、浏览器的支持,但是后端毕竟还是有自己的一套生态,还是需要尽快把 WebAssembly 整合到后端的生态里面去,这是我们今天正在要干的事情。

比如我们正在把 WasmEdge port 到 seL4 上,seL4 是一个可以形式化验证的开源实时操作系统 RTOS 。我们也在 WasmEdge 里原生支持了 TensorFlow 框架,开发者可以通过 WasmEdge 以本地速度调用 TensorFlow 模型,进行推理。与此同时,我们自己在 Crun Runc 的基础上开发了 Crunw,让 K8s 支持 WebAssembly。

OSCHINA:让K8s能够直接管理,这代表着什么?

Michael: K8s 是管理微服务和服务网格的重要工具,这样就意味着 Wasm 应用可以在服务网格里成为一等公民,直接用来实现微服务,不需要借助其他工具和框架。微服务和服务网格是 Serverless 的基础架构,一旦 K8s 支持 Wasm,Wasm 在 Serverless 、微服务领域就会成为一等公民。

有了 Crunw 之后,WasmEdge 能够无缝融入现有的 K8s 生态。现在有很多基于 K8s 的产品都在与 WasmEdge 合作,比如 Linkerd、KubeEdge、SuperEdge 等。

与Docker并肩而行

OSCHINA:WebAssembly会取代Docker吗?同类型的有哪些?相比而言,WasmEdge的优势在哪?

Michael: 在回答这个问题之前,我们先来总结一下目前的容器方案。

Fastly CTO Tyler McMullen 最近说了三句话:虚拟机模拟了计算机,容器模拟了操作系统,WebAssembly 模拟了进程。这三句话怎么理解呢?我们之前发表过一篇文章,和他想表达的东西有异曲同工之妙。我们把容器分为三层:

  • 第一层是系统级或者是硬件级的虚拟机,比如 Hypervisor 或 MicroVM,会运行操作系统与Runtime 软件堆栈;

  • 第二层是应用容器,比如 Docker,容器会在运行用户代码前,加载和启动有操作系统的镜像;

  • 第三层是高级语言虚拟机,比如 JVM、V8 和 WebAssembly。WebAseembly 只是执行编译好的字节码应用,不起操作系统的作用。

理解了这三个层次,就会理解到 WebAssembly 是抽象程度最高的,需要的工具链最复杂,但是带来了性能的巨大的提高。

回到 WebAssembly 能不能取代 Docker 的问题上,这个说法来自 Docker 联合创始人 Solomon Hykes 的一个 tweet。在那条动态里,他说如果 Wasm + WASI 在 2008年就存在了,就没有必要创建 Docker了,Wasm 是云计算的未来。

很多人只看到了这一句话,没有看到他后面补发的内容,他说 WebAssembly 不会取代 Docker,Docker 与 WebAssembly 会肩并肩运行。

在他讲这句话的时候,WebAssembly 的 K8s 生态还没成熟,他这条推特就是在说会在 K8s 里肩并肩运行 WebAssembly 与 Docker,而这也是我们认为的未来,所以我们有 crunw。

所以 ,WebAssembly 与 Docker 不是一个取代关系。WebAssembly 与 Docker 是各有所长、互相补足的关系,就像之前提到的,WebAssembly 对工具链要求比较高,但是 WebAssembly 的性能高、轻量级、安全的特点会让 WebAssembly 用在今天 Docker 进不去的场景。举个具体的例子,WebAssembly 在冷启动方面,能够比 Docker 快100倍。所以 Docker 很难 fit in 的边缘计算、轻服务、汽车、区块链,都是 WebAssembly 的用武之地。

OSCHINA:您认为未来的云原生容器会形成怎样的格局?在其中,WebAssembly会占据怎样的地位?WasmEdge会发挥什么样的作用?

Michael: WasmEdge 这种新容器的发展是扩展了容器或虚拟化的生态。以前,很多地方有虚拟机化的需求,但是 Docker 做不进去,或者 Docker 做得不好,比如 Serverless、边缘设备、边缘云。

这些都是有原生虚拟化的场景,但是 Docker 比较重,比较大,没有办法做到这个场景,所以用 WebAssembly 能够扩展这个市场。WebAssembly 的市场是个增量,并不是要把 Docker 挤出来。

在 AOT 模式下,WasmEdge 是目前市场上最快的 WebAssembly 虚拟机。另外,WasmEdge 的最大不同之处在于,为了能够让 WebAssembly 尽快在云原生领域应用,WasmEdge 还支持了非标准的扩展,比如 KV Store、网络 Socket、TensorFlow 等扩展,可以说 WasmEdge 是离场景最近的 WebAssembly Runtime。 作为 CNCF 唯一的 Webassembly Runtime 项目,我们希望成为WasmEdge 成为云原生和边缘计算的轻量级容器首选。

(WasmEdge 架构图)

嘉宾简介:

Michael Yuan 毕业于德克萨斯大学奥斯汀分校,获得博士学位。Michael 是 JBoss 的早期员工,被 Red Hat 收购之后,作为产品经理见证了世界上第一个成功的开源商业模式,著有5本国际知名出版社出版的技术书籍。2019年 ,Michael 发起了 WasmEdge 项目,提供下一代云原生和边缘计算的执行环境。

评论