作者:Renee Shah,Amplify Partner
原文链接:https://reneeshah.medium.com/how-webassembly-gets-used-the-18-most-exciting-startups-building-with-wasm-939474e951db
本文的翻译与转载已获得原作者 Renee 的授权。
每当我聊起我对 WebAssembly(简称 “Wasm”)感兴趣时,大家常常问我 “WebAssembly 到底能用在哪里?” 。因此就有了这篇文章,我将讲解初创公司在生产中如何使用 WebAssembly 。和其它新兴技术一样,一项技术的早期,五成的精力会花在如何以及怎样使用方面的探索。我希望这篇文章能让开发者更深入地了解人们日常是怎么使用 Wasm 的,并帮助大家更好地进行技术选择。
本文结构
本文假设你对 WebAssembly 已经有了一定的了解,但如果你需要入门指引,可以查看这篇文章[1]。我和 18 家初创公司聊了聊,这些公司或在生产中使用了 WebAssembly,或在创建核心基础设施以开发 Wasm 应用程序。[^1] 每家受访公司都回答了两个问题,答案就在问题后面。
- 你是如何使用 Wasm 的?
- 你为什么从所有的技术方案中选择了 Wasm?
我将这18家公司分成了以下几类:
构建的产品中使用了 Wasm 技术的初创公司
- 服务端
- 客户端
构建 Wasm 基础设施的初创公司
- 服务端
- 客户端
让我们开始吧。
产品使用 Wasm 技术的初创公司
使用 Wasm – 服务端
Drifting in Space[2],Paul Butler[3],创始人
你们是如何使用 Wasm 的? 我们做的是 Jamsocket[4], 它允许开发者为每个用户即时部署服务器。为了和现有镜像兼容,我们使用 OCI 容器作为部署单元,但我们有一个使用我们的开源 Stateroom[5] 包部署 Wasm 服务器模块的工作流程。我们正在尝试在不使用 Docker 的情况下直接用 Wasm ,这样可以缩短冷启动时间。
为什么选择 Wasm? 我们的核心功能取决于我们的服务器启动以响应用户操作,因此冷启动时间非常重要。相对于 Docker,Wasm 提供了快速的冷启动时间,并开辟了有趣的可能性,例如在节点之间移动正在运行的模块,以在运行模块的资源需求发生变化时对其进行负载平衡。
Hash.ai[6],David Wilkinson[7], CEO
你们是如何使用 Wasm 的? HASH[8] 使用 Wasm 作为我们仿真引擎的通用字节码的关键层。我们用 Rust 编写 hEngine[9]并包含一个 Wasm 编译目标,然后从我们的其他语言(包括 Python 和 JavaScript)调用 Wasm,以访问任何环境中的通用引擎处理。通过将 Wasm 嵌入到我们的 Web 应用程序中,我们获取一个可以在客户端运行代码的高性能仿真引擎,并且可以轻松地确保跨多个代码编写平台的仿真行为一致。
为什么选择 Wasm? 在 HASH 诞生之初,Wasm 让我们选择了 Rust 作为我们的核心平台编程语言。Wasm 正在迭代成为一个更加可移植、可访问和高效的执行环境,这意味着我们能够相信 Rust 和 Wasm 会朝着我们需要的方向发展。Rust 和 Wasm 也确实有着这些发展。我们也很看好 Wasm 继续成长为可跨语言和平台访问的通用 runtime 和互操作层。
Hotg.ai[10],Kartik Thakore[11], CTO
你们是如何使用 Wasm 的? 我们将 Wasm 用作我们核心产品 Rune 的一部分,它是一个用于云和边缘的开源的可移植机器学习和计算容器。我们还在我们的 Saas 产品中使用 Wasm,以使用 witx 提供直接的元数据和接口。Witx 是一种接口规范,可以更轻松地将 wasm 集成到大量的环境中。
为什么选择 Wasm? 我们选择 Wasm 是因为我们需要为不同设备和机器学习框架提供可移植能力。Wasm 还允许我们为客户确保边缘计算的工作负载。
Styra[12], Anders Eknert[13], 开发者布道师
你们是如何使用 Wasm 的? Styra 在商业化 Open Policy Agent (OPA)。OPA 允许将自己的 Rego 语言写的 policy 编译为 Wasm,用于分发到可能无法调用 OPA REST API 的系统和平台。之所以不可用,通常是因为性能,但也可能是由于资源或环境限制。
为什么选择 Wasm? OPA 的核心理念之一是,OPA 应该在所有地方都可用,同时尽可能就近在(OPA 为之进行 policy 决策的)服务旁部署。Wasm 将 policy 实施带到了以前 OPA 难以集成的环境中,并开拓大量新的、令人期待的应用场景!
Substrait[14],Jacques Nadeau[15], Substrait & Apache Arrow 共同发明人,Stealth CEO 兼联合创始人
你们是如何使用 Wasm 的? Substrait 是一个开源项目,专注于跨分析系统公开标准化计算计划,从而达成两件事:1)Polyfill 底层分析引擎的能力。有时,一个系统中的函数或操作在另一个系统中不可用。Wasm 可以补充基本的底层功能(使一个分析引擎中的操作在另一个平台上可用)。2) 将用户定义的业务逻辑嵌入到 SaaS 应用程序的容器化包中。在 Pandas[16] 和 Spark[17] 等数据工作流系统中,用户经常将业务逻辑嵌入数据转换管道中,但移动此逻辑可能很困难。Wasm 是一种将这些操作打包成安全可执行文件的方法,允许通用分析系统执行任意“用户定义”业务逻辑。
为什么选择 Wasm? 传统上,系统通过特定语言特定的 SDK(通常是Javascript 通过 V8 或 Java )提供扩展功能。然而,这些扩展模式有几个弱点:每种语言都是额外的麻烦;沙箱模型通常不成熟;并且难以理解计算成本。最常见的现代 SaaS 方法是通过 HTTP 调用外部 FaaS 平台。这种方法解决了沙箱和性能问题,但吞吐量和延迟仍然令人困扰。AWS Athena[18] 等系统试图通过 batching 缓解这些问题,但最终,与内核处理模式相比,外部 FaaS 模式显得苍白无力。Wasm 是第一个在 SaaS 服务上提供接近原生性能的基础技术,但有着有效管理沙箱和计算成本的底层架构。我们相信这些好处将促使 Wasm 成为现代数据系统扩展的默认模型。
Tetrate[19], Zack Butcher[20],产品负责人
你们是如何使用 Wasm 的? Tetrate 在使用 Wasm 为 Envoy 带来自定义策略和安全性,为我们的服务网格客户的复杂应用场景赋能。我们正在通过 wazero[21] 帮助启用 Wasm —— 一个超轻量级、跨平台、零依赖的 Wasm runtime,它开源且速度飞快。
为什么选择 Wasm? 将功能从边缘迁移到更靠近需要它的应用程序(促进零信任架构)以及从应用程序迁移到平台(减少开发者工作量)是服务网格的两个最大优势。服务网格的两个最大优势,是将功能从应用程序移入平台,从而减少开发者的工作量,以及将功能从边缘转移到更靠近应用程序的位置,这有助于实现零信任架构。做多 Wasm (Investing in Wasm)的强大能力、受欢迎程度和灵活性,让我们很好地为客户实现以上的迁移。
使用 Wasm – 客户端
DuckDB[22], Hannes Mühleisen[23],CEO
你们是如何使用 Wasm 的? DuckDB 致力于让分析性 SQL 处理对每个人都简单易得。这和 WebAssembly 有着天然地契合,速度快,而且可以通过 Web 将我们的覆盖范围延伸到数百万设备上。我们的用户乐于看到我们在 Python 和 R 等语言性能上的专注,我们很高兴现在可以为 Javascript 提供相同的体验。
为什么选择 Wasm? 我们正使用 WebAssembly 驱动 DuckDB-Wasm, 用于 Web 的进程内分析 SQL 数据库。几十年来,浏览器中的分析一直因为处理效率有限受到阻碍,但 WebAssembly 改变了这一点。借助 WebAssembly,我们可以为 Javascript 提供 DuckDB 的全部功能,并以低延迟提供接近原生的执行速度。
Dynaboard[24],Alex Kern[25],CEO
你们是如何使用 Wasm 的? Dynaboard 用 WebAssembly 让我们的多人编辑器性能优异、安全且功能强大。
为什么选择 Wasm? WebAssembly 是目前为止最强大且优雅的沙箱 。通过将代码编译到 WebAssembly 并选择性地公开 API,平台可以在浏览器中以接近本机的速度安全地运行用户提供的代码。越来越多的基于浏览器的应用程序使用这种方法来启用其丰富的插件生态,从而为开发者提供比以往任何时候都强大的扩展这些应用程序的能力。开发者可以使用他们选择的编程语言并充分利用包管理器的强大功能。更重要的是,相同的基于 Wasm 的执行引擎可以在服务端运行,从而在边缘执行可靠的服务端渲染(SSR)。WebAssembly 的这种同构属性——一次编译代码并几乎在任何地方运行它的能力——为所有类型的 Web 平台开启了新的可能性。Dynaboard 是用上面两种方式使用 WebAssembly 的。
Runway[26],Cristóbal Valenzuela[27],CEO
你们是如何使用 Wasm 的? 我们用 Wasm 为我们的视频编辑器做一些低级别(low-level)媒体操作和特效渲染。
为什么选择 Wasm? Wasm 允许我们利用现有的丰富低级别(low-level)媒体和图形库生态,并为我们提供在客户端和服务端重用相同代码的灵活性。
构建 Wasm 基础设施的初创公司
构建 Wasm 基础设施 —— 服务端
Akkoro[28],Dan Cook[29],CEO
你们是如何使用 Wasm 的? 目前,我们正在尝试使用 Wasm 模块作为一种安全地将数据交易代码或转换(transformation)迁移到客户端的方法,这些客户端内嵌了基于能力的权限。我们还使用 AssemblyLift Wasm 来服务我们来自 AWS Lambda 的静态登录页面等等(几乎零成本的情况下!)
为什么选择 Wasm? Wasm 有几个特性使其对后端和客户端 SDK 具有吸引力。我认为,它的简洁确实非常关键。它没有容器系统或交付整个操作系统的开销,可以嵌入到其他代码中,并且它提供了一个沙箱环境来启动!
Deno[30], Luca Casonato[31] 和 Bartek Iwańczuk[32]
你们是如何使用 Wasm 的? 在 Deno,我们在生产中广泛使用 WebAssembly。我们会将大量 Rust 代码编译并分发为 Wasm,这样,我们可以在沙箱 V8 隔离中运行 Wasm。一个很好的应用场景是使用我们的 Deno Deploy 产品在靠近用户的边缘运行 Wasm。
为什么选择 Wasm? 一个应用场景是 https://doc.deno.land/[33] 服务,它使用我们的基于 Rust 的 deno_doc crate 编译成为的 Wasm 来快速解析 JS 和 TS 源代码,并由此生成文档。我们使用 Wasm 因为它让我们能在 Deno CLI(编译为本地机器代码)和我们在 V8 隔离中运行在边缘的 Web 服务之间共享这个 Rust 代码。”
Fermyon[34], Matt Butcher[35], CEO
你们是如何使用 Wasm 的? WebAssembly 是 Fermyon 平台背后的基础计算技术。我们正在构建一套工具,以充分发挥 Serverless 效用并提供优雅的开发者体验。Wasm 广泛的语言支持和非凡的性能为微服务和 Web 开发者提供了关键的优势。使用起来有多容易?我们用一个周末就构建了一个 WebAssembly 内容管理系统。
为什么选择 Wasm? Fermyon 认为 WebAssembly 是云计算的下一个浪潮。Wasm 通过提供快速、安全、跨平台的计算引擎来补充虚拟机和容器,该引擎实现了 Serverless 许多未实现的目标。Wasm 可以纳入进微型嵌入式设备或利用数据中心的高级特性,用其性能匹配硬件能力。这是下一代计算平台的良好基础。
Infinyon[36],A.J. Hunyady[37], CEO
你们是如何使用 Wasm 的? InfinyOn, 一个智能数据流公司,使用 Wasm 处理在 Fluvio 和 InfinyOn Cloud 平台上执行实时转换。数据工程师可以在单个统一集群中构建具有事件流处理和数据转换的现代应用程序。构建创新的 Wasm 模块,通过分布式智能和集中控制确保数据质量。
为什么选择 Wasm? Wasm 为构建智能数据管道提供完整的可编程性,从而释放数据工程师的创造力。SQL 或 API 等替代方案限制了数据转换功能并且范围有限。Wasm 的灵活性允许跨网络进行广泛的转换,无论是云计算、移动计算还是边缘计算。
Lunatic[38], Bernard Kolobara[39], CEO
你们是如何使用 Wasm 的? Lunatic 使用 WebAssembly 把所有 Erlang 的特性 (大规模并发、分发和容错)赋能给许多不同的编程语言。我们相信 Erlang 是一个超能武器[40],我们希望通过 Wasm 将这种超能力赋予所有开发者,无论他们选择何种编程语言。
为什么选择 Wasm? Lunatic 核心特性之一是轻量级隔离,因此 Wasm 的安全性非常重要。正因此,Lunatic 可以同时运行许多 Wasm 程序,即便其中一些是恶意程序。没有了 WebAssembly,就不可能构建像 Lunatic 这样的平台。
Profian[41], Nick Vidal[42], 社区经理
你们是如何使用 Wasm 的? Profian 是 Enarx[43] 开源项目的保管人。我们的目标是使机密计算更加可得。通过使用 Wasm,我们使开发者可以轻松地将他们的敏感应用程序和数据部署到具有加密保证的云中,为实现提供广泛的语言选择,并抽象出支持机密计算的不同硅架构。
为什么选择 Wasm? Wasm 和机密计算相得益彰,因为 Wasm 提供了一个沙箱环境,可以保护主机免受错误或恶意应用程序的侵害,而机密计算提供了一个可信的执行环境,可以在 host 被入侵或不受信任时保护应用程序。
Second State[44], Michael Yuan[45], CEO
你们是如何使用 Wasm 的? Second State 帮助客户部署我们的 WasmEdge[46] Runtime 在下面的应用场景:1) Kubernetes 集群中的微服务(例如 OpenYurt、SuperEdge、KubeEdge),2) 在边缘服务器上呈现前端 UI 的 Serverless 函数(例如,SSR 函数),3) 作为移动设备上的应用程序 runtime(例如 Android 和 Open Harmony),以及 4) 作为区块链上的智能合约 runtime(如 Polkadot、ParaState、Oasis 和 FileCoin)。
为什么选择 Wasm? WebAssembly 是一个高性能轻量级且多语言应用程序“容器”,得到行业标准容器管理工具的广泛支持。我们用 Wasm 将云原生编程模型扩展到资源受限和性能敏感的环境,例如边缘云、嵌入式/ Serverless 函数平台、区块链以及移动和物联网设备。
Suborbital[47],Connor Hicks[48],CEO
你们是如何使用 Wasm 的? 我们在使用服务端的 WebAssembly 颠覆云应用程序的开发。开发者应该能专注在让应用程序本身独一无二上,而无需花时间担心安全性或可扩展性。通过严格控制 Wasm 沙箱并恰如其分地利用其轻量级特性,我们确保开发者能够构建和部署易于理解、天生安全和即时扩展的系统。
为什么选择 Wasm? WebAssembly 让我们所做的一切成为可能。这样新技术囊括了最佳虚拟化、安全性和高性能,由此进行开发,我们可以实现之前在 VM 或容器时代根本不可用的各种系统设计。随着云原生领域对 Wasm 的采用更加普遍且不断深化,我们相信它将以同样的方式成为一种商品,同时,将使构建系统的能力民主化,目前这样的能力还只是科技巨头的特权。
构建 Wasm 基础设施 – 客户端
ZapLib[49], Steve Krouse[50], 联合创始人
为什么选择 Wasm? Zaplib 是一个程序员用来加速其 Web 应用程序的框架,这是通过将速度很慢的 JavaScript 函数重写为 Rust 并将它们编译为 Wasm 做到的。Zaplib 为 Rust 提供了一个 Wasm-safe 的标准库、用于在 Wasm 和 JS 之间传讯的高效 API,以及图形 API。
为什么选择 Wasm? Wasm 是让用 Rust 来加速 web apps 成为可能的技术。WebAssembly 比浏览器中的任何其它方案都更快。没有 Wasm,我们的整个框架和业务就不会存在。
前景展望?可以留意的领域
上文是对 Wasm 在客户端和服务端是如何使用的速览。下面会聊聊我看到的一些未来的机会。可以看出,这些想法还没有完全成熟,但我希望能激发一些大有裨益的讨论:
客户端 Wasm
Figma[51]、Autodesk[52] 和 Google Earth[53] 都使用 WebAssembly 构建了令人惊叹的浏览器体验。但同时,开发者也需要在没有大公司预算和专业知识的支持的情况下,能在浏览器享用 Wasm。一些可以改善客户端 Wasm 体验的机会:
- 框架: 仍然没有足够的客户端 Web 框架使用 WebAssembly 来操作 DOM。开发者在构建应用程序时想要很多选择,而现在,可选项仅限于少数 Wasm 框架——最为人熟知的是微软的 Blazor[54]。
- 特性支持: 跨浏览器对 WebAssembly 的特性支持存在差异,因此很难构建适用于所有浏览器的体验。在简化这种体验方面还大有可为。
- Debug: WebAssembly 应用 debug 还是很难,这大大限制了开发者的生产力。
服务端 Wasm
这篇文章中的几家初创公司正在使构建和部署 WebAssembly 应用程序变得更加容易。这些公司在短时间内取得了很大的成就。以下是一些发展的机会:
- 可观测性 —— 我很好奇 WebAssembly 应用程序的可观测性会怎样发展。向容器/微服务的迁移催生了新的可观测性解决方案,如 Honeycomb[55] 和 Lightstep[56],我相信向 WebAssembly 服务端的迁移也会如此。
- 数据库 —— 让“计算更接近数据”似乎是低延迟应用的未来。WebAssembly 模块很小且易于集成,因此它们可以放在数据库中。我不确定这个领域的产品会是什么样子,但我看到了一些使用 Wasm 模块在数据库中扩展用户定义函数 (UDF)的尝试。
- 安全性 —— 我还是觉得需要有一个特定于 Wasm 的安全范式。WebAssembly 模块没有任何内置访问权限,因此开发者必须明确授予能力,这使得这些模块更加安全。但是,这些模块还是可能变成新的攻击目标[57],可以想象可能被精明的黑客盯上。
注释
[^1]: 我没有谈到任何上市公司。也没有讨论区块链/ Web3 公司。无疑,许多 Web3 公司也在 WebAssembly 领域做着激动人心的工作,不过这些不是我的专长。
参考资料
[1]
查看这篇文章: https://harshal.sheth.io/2022/01/31/webassembly.html
[2]
Drifting in Space: https://driftingin.space/
[3]
Paul Butler: https://www.linkedin.com/in/paulgb/
[4]
Jamsocket: https://jamsocket.com/
[5]
Stateroom: https://github.com/drifting-in-space/stateroom
[6]
Hash.ai: https://hash.ai/
[7]
David Wilkinson: https://www.linkedin.com/in/delta/
[8]
HASH: https://hash.ai/
[9]
hEngine: https://hash.ai/platform/engine
[10]
Hotg.ai: https://hotg.ai/
[11]
Kartik Thakore: https://www.linkedin.com/in/kartikthakore/
[12]
Styra: https://www.styra.com/
[13]
Anders Eknert: https://www.linkedin.com/in/anderseknert/
[14]
Substrait: https://substrait.io/
[15]
Jacques Nadeau: https://www.linkedin.com/in/jacquesnadeau/
[16]
Pandas: https://github.com/pandas-dev/pandas
[17]
Spark: https://github.com/apache/spark
[18]
AWS Athena: https://aws.amazon.com/athena/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc
[19]
Tetrate: https://www.tetrate.io/
[20]
Zack Butcher: https://www.linkedin.com/in/zack-butcher-339a2180/
[21]
wazero: https://github.com/tetratelabs/wazero
[22]
DuckDB: https://duckdb.org/
[23]
Hannes Mühleisen: https://www.linkedin.com/in/hfmuehleisen/?originalSubdomain=nl
[24]
Dynaboard: https://dynaboard.com/
[25]
Alex Kern: https://www.linkedin.com/in/alexanderskern/
[26]
Runway: https://runwayml.com/
[27]
Cristóbal Valenzuela: https://www.linkedin.com/in/cvalenzuelab/
[28]
Akkoro: https://akkoro.io/
[29]
Dan Cook: https://www.linkedin.com/in/danielallancook/
[30]
Deno: https://deno.land/
[31]
Luca Casonato: https://twitter.com/lcasdev
[32]
Bartek Iwańczuk: https://twitter.com/biwanczuk
[33]
https://doc.deno.land/: https://doc.deno.land/
[34]
Fermyon: https://www.fermyon.com/
[35]
Matt Butcher: https://www.linkedin.com/in/mattbutcher/
[36]
Infinyon: https://www.infinyon.com/
[37]
A.J. Hunyady: https://www.linkedin.com/in/ahunyady/
[38]
Lunatic: https://lunatic.solutions/
[39]
Bernard Kolobara: https://www.linkedin.com/in/bkolobara/
[40]
超能武器: https://www.wired.com/2015/09/whatsapp-serves-900-million-users-50-engineers/
[41]
Profian: https://www.profian.com/
[42]
Nick Vidal: https://www.linkedin.com/in/nickvidal/
[43]
Enarx: https://enarx.dev/
[44]
Second State: https://www.secondstate.io/
[45]
Michael Yuan: https://www.linkedin.com/in/myuan/
[46]
WasmEdge: https://github.com/WasmEdge/WasmEdge
[47]
Suborbital: https://suborbital.dev/
[48]
Connor Hicks: https://www.linkedin.com/in/connor-hicks-05044166/
[49]
ZapLib: https://zaplib.com/
[50]
Steve Krouse: https://www.linkedin.com/in/stevekrouse/
[51]
Figma: https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/
[52]
Autodesk: https://blogs.autodesk.com/autocad/autocad-web-app-google-io-2018/
[53]
Google Earth: https://web.dev/earth-webassembly/
[54]
Blazor: https://github.com/dotnet/blazor
[55]
Honeycomb: https://www.honeycomb.io/
[56]
Lightstep: https://lightstep.com/
[57]
攻击目标: https://www.usenix.org/conference/usenixsecurity20/presentation/lehmann