高盛集团有个每天平均数百万次,爆量甚至可达到上亿次呼叫的开发者平台,用不同种语言开发的API外挂,都全面改用Wasm来封装,大幅简化了部署和管理的工作。(图片来源/高盛集团)
国际顾问公司Gartner每年都会发表一张新兴科技发展周期报告,盘点2千项技术和应用框架,以未来2年到10年的变革和影响性为比较标准,选出当年最重要的25项新兴技术,绘制成当年的新兴技术成熟度曲线图。全球爆红的生成式AI,正是2023年进入这份清单,但是,在同一年,还有另一项技术和GAI一起入选,就是WebAssembly,简称Wasm。
WebAssembly的影响力媲美GenAI和Docker
到了2024年的新兴科技发展周期报告,Gartner甚至将WebAssembly和GenAI并列为唯二,跨出「期望过高的巅峰期」,即将进入技术成熟度曲线的「幻灭期」,这也代表了,Gartner认为,这两项技术已经度过了炒作阶段,接下来经过一段时间改善和优化,就会进入稳定发展的成熟期,最快2~5年,就会对全球带来变革式的影响。
Gartner对WebAssembly影响力的期待,仅次于GenAI,远远超过其他新兴技术。Gartner特别看好WebAssembly的理由是,这项技术赋予网页应用超高效能,特别适合微服务和无伺服器环境的应用。目前的缺点是,会提高复杂度,大规模导入的学习门槛也很高。
不只跨国顾问公司看好这项技术,今年是K8s问世十年,因这项技术扩大成型的云原生生态圈,回顾过去之际,也开始思考K8s和云原生技术的下一个十年发展方向。有不少技术意见领袖,纷纷将WebAssembly视为K8s下一个十年最重要的发展,与eBPF、IT永续并列为云原生技术未来三大关键发展方向。尤其到了今年11月,在美国盐湖城举办的Kubecon北美场大会中,WebAssembly成了这场K8s生态圈年度大会中最热门的话题。今年也首度将WebAssembly技术年会与Kubecon大会共同举办,不少科技公司和企业出来分享自己使用Wasm的经验,例如美国高盛金融集团、德国制造大厂博世Bosch集团、工厂自动化设备大厂西门子等。
CNCF推广大使太田航平早在今年10月来台参加K8s高峰会时,在主题演讲中就强调,K8s的下一波发展有三大重要机制,第一项就是WebAssembly。为何这项技术对云原生的发展,非常重要?他解释,WebAssembly可以提供一个独立的执行环境,不限任何开发语言、作业系统和CPU的执行环境。换句话说,WebAssembly可以提供一个通吃任何开发语言、作业系统,甚至是CPU架构的执行环境。他更现场展示后端工程师惯用的GO语言、网站开发语言Ruby和行动应用常用的Swift如何编译成Wasm格式的二进会档来执行,Docker容器也可以放进Wasm来执行。
太田航平特别强调,WebAssembly技术,可以将不同的开发语言编译成二进位格式的档案,再部署到浏览器或非浏览器的环境中执行。「WebAssembly提供了一个安全、轻便而且可以在任何地方执行的环境。」
不只科技巨头,跨国金融集团、制造大厂也开始尝试
Google是参与WebAssembly标准的推动者,更是第一批采用这项技术的科技公司,许多知名的服务都靠WebAssembly来创造出流畅的使用体验,像是用C++语言开发的Google地球,就是靠V8浏览器引擎的WebAssembly多执行绪支援,才在浏览器中实作出桌面版般的任意放大缩小、飞行视角般的浏览操作。线上版Google Sheets用Wasm封装Java计算引擎,让超大型试算表提高了1.8倍的计算速度。Google Photo团队则靠Wasm,将用单一语言开发的照片编辑功能程式码,部署到iOS、Android和Web等不同平台上,开发一次,不用任何改写就能到处部署。
Google旗下开源机器学习框架TensorFlow的JS版本的核心,同样用Wasm缩短了好几倍的模型推论时间,甚至用Wasm结合多执行绪,比用GPU加速的JavaScrpit 2D/3D函式库WebGL来执行相同推论,可以缩短好几倍的时间,这个效能优化,让没有GPU的行动装置,也能快速进行AI推论。
Adobe是另一家大力拥抱Wasm的爱用者,像是Lightroom线上相片编辑和特效工具、Express(前身是Spark)线上相片设计工具,都采用了WebAssembly技术来优化操作体验。甚至是他们旗下最知名的设计工具Photoshop,这是一套用C++语言开发的多执行绪软体,Adobe花了很多年,想要将这款设计圈最重要的软体搬上云端,一直克服不了JavaScript的效能问题,后来找来Google帮忙,才在2021年,打造出Web版Photoshop测试版,去年正式推出,Adobe也用这项技术陆续将更多需要重度运算需求的软体产品,也慢慢搬上云端。
光是运用WebAssembly的SIMD(单指令流多资料流)处理能力,对大型图档中大量像素进行平行处理计算,平均就提高了3~4倍的处理速度,有些特效处理甚至可以加快80~160倍的速度。WebAssembly让线上版Photoshop具有不输桌面原生软体版的流畅性和速度。
高盛集团开发者平台大幅改用Wasm封装API
不只是科技巨头爱用,也有大型企业开始尝试Wasm,例如高盛银行有一个每天数百万次,甚至爆量到上亿次呼叫请求的开发者API平台,他们在2023年时,花了8、9个月验证如何用Wasm来封装不同语言,如Go、Java、Typescript开发的API外挂,统一这些外挂程式的部署和管理。高盛银行第四季正式释出了第一款用Wasm打包的API外挂,不出3个月,全部的API外挂程式在年底时都改用Wasm形式来提供。
高盛集团早在好几年前,就开始采用API优先战略,也推出了一个开发者平台,释出各种类型的API给内部各部门和外部第三方合伙伙伴和合作开发者。
他们也打造了一个完全用API架构的数位银行交易平台,同样提供了大量API,可以将高盛金融服务嵌入到各种第三方应用中。这个开发者评平台提供了包括三大类,资料类AP像是资料筛选、资料分析处理、资料管理等资料类API,也有用于风险分析和投资分析的工具服务,还有一大类是银行金融交易类的API,像是银行交易类API,如支付、财富管理API等,也包括了一套金融区块链API,这些API会以外挂的弹性组合形式来对外提供。这个高盛集团的开发者平台,每天的API呼叫次数加起来,高达数百万次,甚至上亿次。
这些外挂API部分来自开发者平台团队开发,更多是不同产品团队各自开发。因为这些API是多年来陆续开发的成果,采用的开发语言涵盖了Java、Go和TypeScript。不同团队各有自己的开发实践。
高盛平台团队想要找到一个技术,可以用来统一不同开发语言,使用单一独立的runtime环境,来提高安全性,还要让程式码更容易重复使用。所以,他们先从一个重复帐号检查功能开始进行PoC验证,成效不错。
尤其,将Wasm编译流程加入到原有的开发流程时,仍旧可以套用原本多数开发流程的工具和安全机制,像是程式码扫描、套件管理、相依性管理工具,都不需要有太大变动,让开发者可以继续使用原本熟悉的工具。改用Wasm编译后的API程式档案,执行效能明显提高,也更方便和其他部门共享不同程式语言开发的元件。
高盛集团工程管理总监Rohan Deshpande指出,善用Wasm,可以提高API外挂生态圈品质和弹性的关键。
高盛银行有一个每天数百万次呼叫请求的开发者API平台,他们在2023年时开始验证如何用Wasm,来封装不同语言所开发的API外挂,统一这些外挂程式的部署和管理,最后让全部的API外挂程式都改用Wasm形式来提供。图片来源/高盛集团
德国制造大厂Bosch有个研究团队,则在2023年底时,分享了在自驾车软体和工厂系统运用Wasm的经验。他们用Wasm搭配容器技术,来部署汽车驾驶系统的嵌入式软体元件,大幅简化了电动车内不同类型异质装置的安装管理。他们还看上Wasm的毫秒级冷启动能力,在工业自动化设备的边缘主机上,用Wasm来部署监控软体,可以几乎即时的速度,来分析工控PLC系统回传的资料,来判断是否出现问题要发出预警,就算边缘主机当机(制造工厂环境常见的故障风险),也能快速(毫秒等级)在另一台边缘主机启用新的Wasm监控软体,做到几乎即时的故障自动切换能力,不会中断对工厂自动化产线的持续监控。
Amazon影音服务靠Wasm支援8千种各类装置
Amazon的Prime Video服务则看上了Wasm通吃各种装置、平台的能力。Amazon这项影音服务数百万名顾客所用的装置高达8千种类型,除了电脑、手机,还有游戏主机、各类数位电视、机上盒、USB串流棒等。每次要改版,几乎很难针对每一种环境提供专门的升级版本。所以,Amazon从2020年8月开始测试Wasm,发现同样的功能,用Rust语言开发,再编译成Wasm档案格式执行,可以比用JavaScript开发的执行速度快上10到25倍,便决定在2021年大幅改用WebAssembly混用JavaScript,来简化软体版本升级的流程。
Amazon会在装置上预载两种执行环境,一个是WebAssembly VM,另一个是JavaScript VM。需要大量运算的功能,例如动画模拟、渲染计算等,就改用Wasm技术编译成二进位档,放到WebAssembly VM中执行,而Prime Video App则保留原本的JavaScript程式码,载入到另一个JavaScript VM环境中来执行。这个做法,不只更容易靠一两种语言,支援到更多类型的装置,高运算负载的程式码从JavaScript改为Wasm后,省下了30MB的记忆体,只需要7.5MB就能顺畅执行,也降低了不少硬体规格的门槛,提高在低阶或行动装置上的执行效能。
WebAssembly并非是这几年隔空出现的新技术,而是问世十年的老技术,一开始是为了解决 JavaScript直译式语言速度太慢的问题,尤其Web应用的功能越来越复杂,程式档也越来越大,动辄数万、数十万行的Web应用程式码,如何提高大型Web应用在浏览器中的执行速度成了一大挑战。早在2010年时,有位软体工程师Alon Zakai打造了一款工具Emscripten,可以将C/C++程式码编译成JavaScript可执行的形式,2012年更是释出了asm.js技术,这是JavaScript的一项子集合,可以在浏览器中执行C和C++程式码来加速。这是WebAssembly标准出现前的JavaScript应用优化尝试。
2015年5月,JavaScript之父Brendan Eich特别来台参加iThome举办的Modern Web大会,回顾这项技术的开发幕后秘辛以及20年来的发展。在演讲中,他特别展示了在浏览器中执行的第一人称3D射击游戏,来展示当JavaScript执行效率跟Bytecode程式一样时,可以做到的能耐。这个现场展示,震惊所有参加者,包括台下的我。
一个月后,JavaScript之父就和四大浏览器平台,发起了W3C WebAssembly社群小组,想要重新发明JavaScript网页应用,以WebAssembly来命名新技术,顾名思义,就是Web的Assembly(组合语言)形式,要让网页应用也能拥有二进位Bytecode的执行格式。
Brendan Eich指出,WebAssembly格式标准将成为一个网站程式码的新中介层,可以提供一个二进位档案格式标准来执行网页。最大特色是,可以让JavaScript程式的执行速度快20倍,让网页应用也能像桌面原生应用一样的执行速度。因为,WebAssembly标准的作法是,直接定义了一个新的网页执行层,而非如JavaScript子集合的作法,让浏览器能直接执行二进位档案格式的WebAssembly档案,来达到像是执行Bytecode程式般的高效能。而且,当时JavaScript之父更指出一个未来的发展趋势,这项技术不限于JavaScript这种语言,而是任何语言都可以用的技术。
这项技术有多强?像是Adobe大砸200亿美元收购的设计平台Figma,正是靠WebAssembly技术才打造出操作流畅的线上工具,可以在浏览器上使用大量向量元件,组合成复杂、精美的网页版面。正因为WebAssembly可以让Web应用的执行速度,媲美桌面原生软体般的执行速度,所以,不少人用「网页组合语言技术」来形容。
经过两年努力,在2017年时,WebAssembly 发表了第一个版本,获得Chrome、Safari、Edge、Firefox等主要浏览器的支持,也正式成了网页标准之一。不过,这项技术,一开始只能在浏览器环境中执行,想要执行Wasm,还得先安装一只浏览器或浏览器引擎。
Wasm走出浏览器,连Docker之父都惊艳
直到2019年,这一年是 Wasm走出浏览器,迈向广大云原生世界的关键一年。Mozilla、云端业者Fastly等联手发表了WASI(WebAssembly System Interface)专案,提供了一个runtime程式和命令列工具,不需要浏览器,可以直接在桌机或伺服器端执行Wasm应用。同时,专案成员也发起了Bytecode联盟,要将WebAssembly推广到浏览器以外的世界。这也让同一套Wasm封装的程式码,可以在浏览器或非浏览器的环境中执行,不需要维护两套程式码。
2019年是 Wasm走出浏览器,迈向广大云原生世界的关键一年。Mozilla、云端业者Fastly等联手发表了WASI(WebAssembly System Interface)专案,透过独立的runtime和命令列工具,不需要浏览器,也可以直接在桌机或伺服器端中执行Wasm应用。图片来源/Fastly杰出工程师Luke Wagner
「如果WASM和WASI在2008年就出现,我们就不需要发明Docker技术了。」Docker之父Solomon Hykes这一句话点出了WebAssembly技术对云原生生态圈的影响力,可以媲美Docker技术创造了整个云原生技术浪潮的重要性。这句话也成了后来大家谈到WebAssembly发展时,最常被引述的一句话,这是一项连Docker之父都赞叹的新技术。
跨出浏览器之后,横跨到云原生技术圈的WASM生态圈,从2020年开始茁壮,而且相关工具和技术专案数量越来越多,贡献者规模越来越大,更多工具,更多开发语言开始支援,也开始出现大规模开发Wasm用的技术框架。
WASI专案在2021年提出了新的元件模式(Component Model)草案,可以让不同语言写的程式码,编译成Wasm元件,此彼此有一套标准的元件输入输出方式来互动,举例来说,用Go语言写的Wasm元件,和用Rust语言写的Was元件,有共同的标准输入输出方式,就像用同一种语言开发的元件一样,甚至可以把这两个元件,放入一个更大的Wasm元件中混用。这个元件模型,让Wasm具备了跨各种语言的能力,这也是后来WASI专案0.2版的重要特色。Brendan Eich多年前提到的WebAssembly跨开发语言的能力,不只在浏览器中落实,更在浏览器外的广大云原生世界中实现了。
到了2022年,已有超过40种语言支援Wasm,包括Rust, C, C++, JavaScript和GO语言。而且不只伺服器环境,还可以在边缘装置,甚至是IoT设备上执行Wasm程式。2022年10月,Docker公司更宣布加入Bytecode联盟,要让Docker引擎开始支援Wasm,直接在容器执行环境中,也能直接执行Wasm的二进位元件档。
Docker这一步,吸引了更多云原生采用企业对这项技术的关注,云原生组织CNCF在年度调查中观察到,超过37%的企业开始试水温尝试WebAssembly,尤其可用于Serverless架构中的两款Runtime,包括WasmEdge和WAMR开始受到关注。CNCF这份调查报告最后的结论是「容器已经成为新标准,而WebAssembly是未来。」这个云原生生态圈最重要的组织,开始认真将WebAssembly视为接下来的重要发展方向。
不只是容器技术指标厂商开始拥抱,虚拟化技术也开始向Wasm靠拢。微软Azure技术长Mark Russinovich在2023年Build开发者大会上发表了Hyperlight,可以在Hypervisor上直接执行Wasm应用。Hyperlight可以产生一个微型VM(Micro-VM),比执行一个容器所用的资源更小,启动速度超快,具有Hypervisor层隔离强度的执行环境,来执行Wasm元件。1秒钟可以启动1千个这种执行Wasm的微型VM ,延迟时间甚至只有250微秒,也就是一秒的四千分之一。微软让虚拟机器、容器和Wasm可以在同一个Hypervisor环境中并存。
后续报导请见: