百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

WasmEdge 是什么?史上最快 WebAssembly 运行时?

ccwgpt 2024-11-03 12:46 137 浏览 0 评论

家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

前言

WasmEdge 是一个轻量级、高性能和可扩展的 WebAssembly 运行时, 它是当今号称最快的 Wasm VM。

WasmEdge 是由 CNCF 托管的官方沙箱项目,而CNCF 是一个开源的、供应商中立的云原生计算中心,托管 Kubernetes 和 Prometheus 等项目,使云原生具有普遍性和可持续性

WasmEdge的用例包括现代 Web 应用程序架构(同构和 Jamstack 应用程序)、边缘云上的微服务、无服务器 SaaS API、嵌入式功能、智能合约和智能设备等方方面面。

WasmEdge 是世界上第一个正式的 CNCF WebAssembly 运行时项目,可以设想它将作为边缘云的关键任务轻量级运行时,在 CNCF 的开源云计算领域发挥重要作用。

1.WasmEdge 有那些典型特征

1.1 WasmEdge的主要特征

WasmEdge 可以运行从 C/C++、Rust、Swift、AssemblyScript 或 Kotlin 源代码编译的标准 WebAssembly 字节码程序。同时,它还受到标准语言和编译器工具链的支持,例如 LLVM、Rustc 和 emscripten。

WasmEdge在安全快速轻量可移植容器化的沙箱中运行 JavaScript,包括第 3 方 ES6、CJS 和 NPM 模块。 它还支持混合使用这些语言(例如,使用 Rust 实现 JavaScript API)、Fetch API 和边缘服务器上的服务器端渲染 (SSR) 功能。

WasmEdge目前支持所有标准的 WebAssembly 功能和扩展提案,例如:WASI 规范引用类型批量内存操作SIMD,同时也在积极探索 wasi-socket 提案以支持 WebAssembly 程序中的网络访问。 它还支持许多为云原生和边缘计算量身定制的扩展。例如,WasmEdge 网络套接字和 WasmEdge Tensorflow 扩展。

WasmEdge还支持针对特定应用场景设计的非标准扩展。

1.2 WasmEdge的典型场景扩展

WasmEdge包含下面典型的应用场景扩展。

  • Tensorflow开发人员可以使用简单的 Rust API 编写 Tensorflow 函数,然后在 WasmEdge 中以本机速度安全地运行该函数,同时WasmEdge也在积极支持其他人工智能框架。
  • Storage:WasmEdge 存储接口允许 WebAssembly 程序读写键值存储。
  • 命令界面: WasmEdge 使 webassembly 函数能够在主机操作系统中执行本机命令。 它支持传递参数、环境变量、STDIN / STDOUT 管道和主机访问的安全策略。
  • 以太坊: WasmEdge Ewasm 扩展支持编译为 WebAssembly 的以太坊智能合约,是以太坊 WebAssembly (Ewasm) 的领先实现。
  • Substrate: Pallet 允许 WasmEdge 在任何基于 Substrate 的区块链上充当以太坊智能合约执行引擎。

此外,WasmEdge 是一个“云原生”WebAssembly VM。 它支持 OCI(Open Container Initiative)规范,这允许 WasmEdge 实例由 Kubernetes 等云原生编排工具进行管理。

2.WasmEdge的使用

2.1 用JS创建WasmEdge程序

WebAssembly 最初是作为“浏览器的 JavaScript 替代品”,即在浏览器中安全地运行由 C/C++ 或 Rust 等语言编译的高性能应用程序。 即在浏览器中,WebAssembly 与 JavaScript 同时存在。

随着 WebAssembly 在云中的使用越来越多,它现在已成为云原生应用程序的通用运行时。 与 Linux 容器相比,WebAssembly 运行时以更低的资源消耗实现更高的性能。

在云原生场景,开发者希望使用 JavaScript 来编写业务应用, 这意味着必须在 WebAssembly 中支持 JavaScript。 此外,还要支持在 WebAssembly 运行时从 JavaScript 调用 C/C++ 或 Rust 函数,以利用 WebAssembly 的计算效率。 WasmEdge WebAssembly 运行时可以做到这一点。


接下来将演示如何在 WasmEdge 中运行和增强 JavaScript。

2.2 在 WasmEdge 上快速开始 JavaScript

首先为 WasmEdge 下载基于 WebAssembly 的 JavaScript 解释器程序,它基于 QuickJS。

curl -OL https://github.com/second-state/wasmedge-quickjs/releases/download/v0.4.0-alpha/wasmedge_quickjs.wasm

现在可以尝试一个简单的“hello world”JavaScript 程序 (example_js/hello.js),它将命令行参数打印到控制台。

import * as os from 'os';
import * as std from 'std';
args = args.slice(1);
print('Hello', ...args);
setTimeout(() => {
  print('timeout 2s');
}, 2000);

在 WasmEdge 的 QuickJS 运行时中运行 hello.js 文件,如下所示。请确保你已经安装了 WasmEdge。

$ wasmedge --dir .:. wasmedge_quickjs.wasm example_js/hello.js WasmEdge Runtime
Hello WasmEdge Runtime


2.2 WasmEdge函数嵌入主机应用程序

接下来将展示如何通过 WasmEdge Node.js SDK 将用 Rust 编写的 WebAssembly 函数合并到服务器上的 Node.js 应用程序中。 这种方法结合了 Rust 的性能、WebAssembly 的安全性和可移植性以及 JavaScript 的易用性。 一个典型的应用程序是按照如下流程工作的。

  • 主机应用程序是用 JavaScript 编写的 Node.js Web 应用程序,它进行 WebAssembly 函数调用。
  • WebAssembly 应用程序是用 Rust 编写的, 它在 WasmEdge 运行时内运行,并从 Node.js Web 应用程序调用。

2.2.1 WasmEdge Node.js SDK

下面例子的 Rust 程序将输入字符串添加到“hello”之后。 您可以在此库文件中定义多个外部函数,所有这些函数都可以通过 WebAssembly 供宿主 JavaScript 应用程序使用。

use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn say(s: String) -> String {
  let r = String::from("hello ");
  return r + &s;
}

接下来将 Rust 源代码编译成 WebAssembly 字节码,并为 Node.js 主机环境生成 JavaScript 模块。

rustwasmc build

所有文件都在 pkg/ 目录中, .wasm 文件是 WebAssembly 字节码程序,.js 文件用于 JavaScript 模块。

2.2.2 Node.js 主机应用程序

接下来,转到文件夹检查 JavaScript 程序 app.js。 有了生成的
wasmedge_nodejs_starter_lib.js 模块,编写 JavaScript 调用 WebAssembly 函数就非常容易了。 下面是节点应用程序 app.js, 它只是从生成的模块中导入 say() 函数。 节点应用程序从传入的 HTTP GET 请求中获取名称参数,并以“hello name”响应。

const { say } = require('../pkg/wasmedge_nodejs_starter_lib.js');
// .js表示JavaScript模块,并导入say方法
const http = require('http');
const url = require('url');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
  const queryObject = url.parse(req.url,true).query;
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  // 服务响应
  res.end(say(queryObject['name']));
});
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

如下所示启动 Node.js 应用程序服务器。

$ node node/app.js
Server running at http://127.0.0.1:3000/

然后,您可以从另一个终端窗口对其进行测试

$ curl http://127.0.0.1:3000/?name=Wasm
hello Wasm

3.总结

本文只是告诉大家什么是WasmEdge?因为笔者不是这方面的专家,很多内容也就浅尝辄止。但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。

参考资料

https://www.secondstate.io/articles/wasmedge-joins-cncf/

https://github.com/WasmEdge/WasmEdge

https://www.cncf.io/

https://wasmedge.org/book/en/sdk/node.html

https://wasmedge.org/book/en/write_wasm/js/quickstart.html

相关推荐

十分钟让你学会LNMP架构负载均衡(impala负载均衡)

业务架构、应用架构、数据架构和技术架构一、几个基本概念1、pv值pv值(pageviews):页面的浏览量概念:一个网站的所有页面,在一天内,被浏览的总次数。(大型网站通常是上千万的级别)2、u...

AGV仓储机器人调度系统架构(agv物流机器人)

系统架构层次划分采用分层模块化设计,分为以下五层:1.1用户接口层功能:提供人机交互界面(Web/桌面端),支持任务下发、实时监控、数据可视化和报警管理。模块:任务管理面板:接收订单(如拣货、...

远程热部署在美团的落地实践(远程热点是什么意思)

Sonic是美团内部研发设计的一款用于热部署的IDEA插件,本文其实现原理及落地的一些技术细节。在阅读本文之前,建议大家先熟悉一下Spring源码、SpringMVC源码、SpringBoot...

springboot搭建xxl-job(分布式任务调度系统)

一、部署xxl-job服务端下载xxl-job源码:https://gitee.com/xuxueli0323/xxl-job二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库三、启动...

大模型:使用vLLM和Ray分布式部署推理应用

一、vLLM:面向大模型的高效推理框架1.核心特点专为推理优化:专注于大模型(如GPT-3、LLaMA)的高吞吐量、低延迟推理。关键技术:PagedAttention:类似操作系统内存分页管理,将K...

国产开源之光【分布式工作流调度系统】:DolphinScheduler

DolphinScheduler是一个开源的分布式工作流调度系统,旨在帮助用户以可靠、高效和可扩展的方式管理和调度大规模的数据处理工作流。它支持以图形化方式定义和管理工作流,提供了丰富的调度功能和监控...

简单可靠高效的分布式任务队列系统

#记录我的2024#大家好,又见面了,我是GitHub精选君!背景介绍在系统访问量逐渐增大,高并发、分布式系统成为了企业技术架构升级的必由之路。在这样的背景下,异步任务队列扮演着至关重要的角色,...

虚拟服务器之间如何分布式运行?(虚拟服务器部署)

  在云计算和虚拟化技术快速发展的今天,传统“单机单任务”的服务器架构早已难以满足现代业务对高并发、高可用、弹性伸缩和容错容灾的严苛要求。分布式系统应运而生,并成为支撑各类互联网平台、企业信息系统和A...

一文掌握 XXL-Job 的 6 大核心组件

XXL-Job是一个分布式任务调度平台,其核心组件主要包括以下部分,各组件相互协作实现高效的任务调度与管理:1.调度注册中心(RegistryCenter)作用:负责管理调度器(Schedule...

京东大佬问我,SpringBoot中如何做延迟队列?单机与分布式如何做?

京东大佬问我,SpringBoot中如何做延迟队列?单机如何做?分布式如何做呢?并给出案例与代码分析。嗯,用户问的是在SpringBoot中如何实现延迟队列,单机和分布式环境下分别怎么做。这个问题其实...

企业级项目组件选型(一)分布式任务调度平台

官网地址:https://www.xuxueli.com/xxl-job/能力介绍架构图安全性为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;调度中心和执...

python多进程的分布式任务调度应用场景及示例

多进程的分布式任务调度可以应用于以下场景:分布式爬虫:importmultiprocessingimportrequestsdefcrawl(url):response=re...

SpringBoot整合ElasticJob实现分布式任务调度

介绍ElasticJob是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目ElasticJob-Lite和ElasticJob-Cloud组成。它通过弹性调度、资源管控、...

分布式可视化 DAG 任务调度系统 Taier 的整体流程分析

Taier作为袋鼠云的开源项目之一,是一个分布式可视化的DAG任务调度系统。旨在降低ETL开发成本,提高大数据平台稳定性,让大数据开发人员可以在Taier直接进行业务逻辑的开发,而不用关...

SpringBoot任务调度:@Scheduled与TaskExecutor全面解析

一、任务调度基础概念1.1什么是任务调度任务调度是指按照预定的时间计划或特定条件自动执行任务的过程。在现代应用开发中,任务调度扮演着至关重要的角色,它使得开发者能够自动化处理周期性任务、定时任务和异...

取消回复欢迎 发表评论: