出品 | OSC开源社区(ID:oschina2013)
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 能够直接接入。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目前最紧迫的问题是兼容性问题?WasmEdge 0.8.2 的功能更新主要是:
1、更好的跨平台兼容性。开发者可以在 Mac OS X(Intel 和 M1)、Windows 10 以及配备 ARM 32 位芯片的 IoT 设备上运行 WasmEdge 应用程序。
2、Networking 支持。WasmEdge 应用程序发出网络请求并运行 HTTP 服务器。
3、新的以及一些改进的 API。在 C、Rust 和 Golang 应用程序中嵌入 WasmEdge 函数。
4、WasmEdge 的 AoT 编译器的通用二进制输出。利用云原生平台中的 AOT 性能增进。
5、支持 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 等。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 成为云原生和边缘计算的轻量级容器首选。最后,想和大家说,我们很看好 WebAssembly 的发展,如果你对 WebAssembly 有兴趣的话,欢迎来我们 GitHub 或 Gitee 上看看:https://gitee.com/mirrors/wasmedgehttps://github.com/WasmEdge/WasmEdge
Michael Yuan 毕业于德克萨斯大学奥斯汀分校,获得博士学位。Michael 是 JBoss 的早期员工,被 Red Hat 收购之后,作为产品经理见证了世界上第一个成功的开源商业模式,著有5本国际知名出版社出版的技术书籍。2019年 ,Michael 发起了 WasmEdge 项目,提供下一代云原生和边缘计算的执行环境。
