WebAssembly已经从浏览器扩展到云 | Pradeep


WebAssembly(WASM) 是一种低级的类汇编语言,旨在实现高效执行和紧凑表示。WebAssembly 是在基于堆栈的虚拟机上运行的二进制编码指令格式或字节码。WASM 在内存安全和沙盒环境中运行。

WebAssembly 被设计为编程语言的可移植编译目标。可以编译 C、C++、.Net、Rust、Python 等编程语言以使用特定于语言的工具链生成 WebAssembly 模块。每个 WebAssembly 文件都是一个高效、优化且自给自足的模块,称为 WebAssembly 模块 (WASM)。这些模块使用 .wasm 文件扩展名。它还定义了一种相应的文本汇编语言,称为 WebAssembly 文本格式 (WAT),它使用 .wat 扩展名。WAT 文件使阅读和理解 WASM 模块变得更容易。生成的 webassembly 模块 (WASM) 可以在任何 WASM 运行时上执行。

WebAssembly 最初被设计为一种技术解决方案,用于加速 Web 浏览器内的代码执行。它并不是要取代 JavaScript,而是与 JavaScript 并行工作。Wasm 克服了浏览器中 javascript 的一些性能限制。WebAssembly 在所有主要浏览器上的普遍接受意味着可以编译非 JavaScript 代码以在任何地方运行。这意味着用 C++ 和其他语言编写的应用程序可以编译为 wasm,从而使它们从桌面到浏览器的过渡更加顺畅并且性能更好。

Blazor是一个基于 WebAssembly 的框架示例,用于在浏览器中运行 Web 应用程序。它在 .Net core 3.1 中发布,并作为 .Net 5.0 的一部分进行了更新。Blazor 允许使用 WebAssembly 托管模型创建引人注目的实时 Web 体验。它允许 .Net 开发人员使用 C# 创建客户端单页应用程序 (SPA)。

云中的 WebAssembly
Wasm 基于全行业的协作努力。WASM 独立于语言、硬件和平台。WASM 具有快速启动时间,没有冷启动问题。它具有低资源开销和高度可移植性。它是安全的,并且在高度受限的沙箱中运行。这使得它非常适合部署在边缘和资源受限的物联网设备上。它还使其成为云上无服务器工作负载的理想选择。
云原生计算基金会 (CNCF) 正在努力创建一个基于 WASM 的应用程序开发平台。字节码联盟由Arm、英特尔、谷歌、微软、Mozilla、Fastly 等主要参与者组成,旨在创建 WebAssembly 标准的共享实现,并使在任何地方运行 WASM 应用程序变得更加容易。

Kubernetes 上的 WebAssembly
容器是在安全可靠的环境中托管工作负载的理想工具。容器运行时限制工作负载滥用敏感的内核调用。但是,锁定容器环境需要付出很多努力,并且随着新 CVE 的报告,它也需要不断修补。容器也不够小,无法在资源有限(CPU、内存等)的环境中运行,例如边缘环境。边缘环境也可以在修补容器无效的低网络带宽环境中运行。WASM 为此类工作负载提供了理想的替代运行时环境。WASM 具有低资源开销和快速启动时间。WASM 的沙盒环境和默认安全运行时模型非常适合此类环境。WASI 解锁了在这些环境中使用 WASM 的能力。

Krustlet是一种在 Kubernetes 上本地运行 WebAssembly 工作负载的工具。Krustlet 实现了 Kubelet API。它充当集群中的一个节点。当用户调度具有特定节点容忍度的 pod 时,Kubernetes API 会将该 pod 调度到 Krustlet 节点。该节点将获取模块并运行它。

使用 WebAssembly 的无服务器
在无服务器世界中,云提供商管理基础架构并允许以更高的敏捷性按需配置。在此模型中,您提供代码,云提供商提供并管理运行它所需的所有资源(容器、网络、操作系统、应用服务器等)。代码在许多其他人共享的服务器上运行,需要隔离以提供安全性并保护其免受其他工作负载可能导致的漏洞的影响。由于资源是按需动态配置的,因此工作负载可能会遇到冷启动问题,同时由于从零启动而配置资源。由于 WebAssembly 的快速启动和隔离的运行时模型,因此在这些情况下是理想的。

Cloudflare 的计算平台Workers是基于 Chrome V8 Javascript 引擎的无服务器运行时。它不使用容器或虚拟机。Workers 托管 WebAssembly 运行时,可用于将 WASM 模块部署为无服务器功能。该模型的启动时间非常快,并且需要的资源更少。