rust加载不进去服务器eac_基于腾讯云的 Rust 和 WebAssembly 函数即服务

1cad3fda22acf21b1c8b222f2fba96db.png

腾讯云云函数 (SCF) 已经支持十多种编程语言和运行时框架。腾讯云最近发布的 SCF custom runtime(自定义运行时)更进一步 —— SCF 现在可以支持用任何编程语言编写的函数。

本文将介绍如何在云函数 SCF 中运行用 Rust 编写的 WebAssembly 函数。

我们先介绍一些基本概念,然后回顾一个完整但简单的 hello world 示例,部署您的第一个 WebAssembly 无服务器函数。最后,我们将用一个机器学习即服务 (MLaaS) 示例来做一些有用的事情。该示例接受数据并以 SVG 格式返回拟合模型和可视化。

这是本教程结束时你将创建的最终应用。它完全是「无服务器」的,只有使用时会产生成本。

HTML 和 JavaScript UI 可以托管在任何计算机上,包括笔记本电脑上。在腾讯云 Serverless 上的后端函数执行机器学习和 SVG 绘图。

为什么选择 WebAssembly 和 Rust

传统的无服务器函数基于重量级的框架。开发者必须在特定的应用框架中编写函数,比如 Node.js 中的 JavaScript 或 Python Boto。

腾讯云 SCF Custom Runtime 打破了这种模式,允许开发者用任何语言编写无服务器函数。

为了演示这个优势,本文提供了基于 Bash 脚本的函数、基于 Deno 的 TypeScript 函数和基于 Rust 的本机二进制函数的示例。这使我们能够在腾讯云上创建和部署基于 web 组件的无服务器函数。

为什么要这么做?

以下是一些原因:

  • WebAssembly 是为性能而设计的。 WebAssembly 函数可以比用JavaScript 或者 Python 快 10 倍。
  • WebAssembly 函数是可移植的。虽然可以在 SCF Custom runtime上运行本地二进制文件,但必须将这些二进制文件编译到 Custom runtime 的确切操作系统环境中。目前在 X86 CPU 上使用的是 CentOS 7.6,之后可能会更改。正如我们将要看到的,WebAssembly 函数是可移植的,并且非常容易部署和管理。
  • WebAssembly 函数是安全的。众所周知,即使使用 Docker,本地二进制应用程序也可能会破坏容器。由于你的应用程序可能依赖于许多第三方库,因此你的依赖项中存在危险代码的风险真实存在。 WebAssembly 有着基于能力的安全模型, 为你的代码提供更好的运行时保护。
  • 虽然 WebAssembly 兼容各种编程语言,但 Rust、AssemblyScript (TypeScript)、C/C++ 和 Go 是写 WebAssembly 函数的最佳语言,尤其是 Rust。Rust 是一种流行且越来越受瞩目的编程语言,社区非常活跃。Rust 让我们能够写一个高效但内存安全的函数。

最后,在腾讯云上编写和部署 WebAssembly 函数实际上非常简单,在一个小时内就可以完成。

前期准备

首先,注册一个腾讯云账户。对大多数开发和个人项目来说,开发工作都可以在免费额度内进行。

确保你已经在地开发计算机或 Docker 容器上安装了 Rust 和 ssvmup 工具链。ssvmup 工具链将 Rust 程序编译并优化为 WebAssembly 字节码。只需使用以下简单命令即可安装。你也可以参考这个指南。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ source $HOME/.cargo/env
... ...
$ curl https://raw.githubusercontent.com/second-state/ssvmup/master/installer/init.sh -sSf | sh

WebAssembly 函数是在 Second State 虚拟机 SSVM 里执行的。SSVM 是专为服务端的用例和应用优化的高性能 WebAssembly 虚拟机。

Hello, world

要在腾讯云上部署 Rust 和 WebAssembly 函数, 我们建议 clone 或者 fork GitHub 上的模板 repo,并把这个模板作为你自己应用的基础。

main.rs 上的 Rust 函数是我们将部署到 SCF 的无服务函数。正如你能从源代码看到的那样,它能从 STDIN 读取函数的输入, 然后用 println! macro 把结果发送到 STDOUT。

use std::io::{self, Read};
use serde::Deserialize;fn main() {    let mut buffer = String::new();    io::stdin().read_to_string(&mut buffer).expect("Error reading from STDIN");    let obj: FaasInput = serde_json::from_str(&buffer).unwrap();    let key1 = &(obj.key1);    let key2 = &(obj.key2);    println!("Hello! {}, {}", key1, key2);
}#[derive(Deserialize, Debug)]
struct FaasInput {    key1: String,    key2: String
}

Rust main() 函数使用 serde 库来从 STDIN 解析一个 JSON 字符串。

JSON 看起来像下面这样。 我们之所以用这种方式编写函数,是因为SCF 使用内置的 hello world JSON 模板来测试部署好的函数。

{  "key1": "test value 1",  "key2": "test value 2"
}

函数提取 key1 和 key2 值并输出下面的 hello 消息到 STDOUT。

Hello! test value 1, test value 2

但是,这个函数的 web 请求是如何被转换成 STDIN 的?如何将 STDOUT 中的函数响应转换为 HTTP 响应?

这是通过我们模板中的 SCF custom runtime 基础设施和引导 (bootstrap) 程序完成的。

正如你所看到的那样,引导程序只是一个 bash shell 程序,它不断地轮询云函数 SCF 以查找传入的请求。它将传入的请求转换为 STDIN,并通过 SSVM 调用 WebAssembly 函数。然后,它接受 STDOUT 输出,并将其作为函数的响应发给 SCF。

如果你使用我们的模板,就不需要修改引导程序。

现在,可以使用 ssvmup 将 Rust 函数构建到 WebAssembly 字节码中,然后将 zip 文件打包,从而在腾讯云 SCF Custom Runtime 上进行部署。

$ ssvmup build
... ...$ cp pkg/hello_bg.wasm cloud/
$ cd cloud
$ zip hello.zip *

按照这个说明和截图来部署并测试上面 hello.zip 文件。现在已经成功地部署了一个 WebAssembly 无服务器函数!

接下来,让我们用 Rust 函数创建一个有价值的 web 服务。

机器学习即服务

这个例子中,我们选择了一个计算密集型的机器学习任务来演示 Rust WebAssembly 函数的性能。

无服务器函数采用以逗号分隔的数字输入字符串,这些数字表示二维平面上的一组点。输入的数据格式是 x1,y1,x2,y2,...

该函数分析数据并计算两个特征向量,指示数据中最大方差的方向。特征向量为数据科学家提供了关于驱动数据变化的潜在因素的线索。这就是所谓的主成分分析。

我们的函数创建一个 SVG 图,并且在这个图上绘制输入的数据点以及上面计算得到的特征向量。该函数最后以 XML 文本的形式返回这个 SVG 图。

要开始这个例子,你可以 clone 或者 fork 这个 repo。该项目在 tencentcloud/ssvm/pca 文件夹中。或者你可以复制 Cargo.tomlsrc/* 的内容到上文的 hello world 模板。如果你选择后者,确保你修改了 Cargo.toml,将其指向 Rust 机器学习库的正确源代码文件夹。

本教程中不会深入探讨 PCA 或 SVG 生成的 Rust 源代码的细节,因为它们涉及大量的计算代码。

遵照与 hello world 示例中相同的步骤。使用 ssvmup 构建一个 pca.zip 包,并将其部署到腾讯云 SCF custom runtime 上。

接下来,我们将部署好的函数与 web API 网关关联起来,以便可以从 web HTTP 或 HTTPS 请求调用它。在 SCF 的 web 控制台的触发管理选项卡中执行此操作。这里可以查看教程和截图

API 控制台将 HTTP 请求转换为无服务器函数的 JSON 输入。例如,这里有一个对 API 网关 URL 的 HTTP POST 请求。我们将来自 iris.csv 文件的以逗号分隔的数据点放在 POST 主体中。

$ curl -d @iris.csv -X POST https://service-m9pxktbc-1302315972.hk.apigw.tencentcs.com/release/PCASVG

API 网关将以下 JSON 传到 Rust 函数的 STDIN。POST body 现在是 JSON 中的 body 属性。

{"body": "3.5,0.2,3,0.2,...","headerParameters": {},"headers": {"accept": "/","content-length": "11","content-type": "application/x-www-form-urlencoded","host": "service-aj0plx8u-1302315972.hk.apigw.tencentcs.com","user-agent": "curl/7.54.0","x-anonymous-consumer": "true","x-api-requestid": "e3123014742e7dd79f0652968bf1f62e","x-b3-traceid": "e3123014742e7dd79f0652968bf1f62e","x-qualifier": "$DEFAULT"},"httpMethod": "POST","path": "/my_hk","pathParameters": {},"queryString": {},"queryStringParameters": {},"requestContext": {"httpMethod": "ANY","identity": {},"path": "/my_hk","serviceId": "service-aj0plx8u","sourceIp": "136.49.211.114","stage": "release"}
}

Rust 函数解析主体中的数据,执行 PCA,并生成 SVG 图形。它将 SVG 内容打印到 STDOUT,后者由 API 网关获取并作为 HTTP 响应发送回来。

要在 AJAX 请求中使用此 API 网关 URL,还必须配置腾讯云网关以接受 CORS web 请求。查看指南,了解如何做到这一点。

下面的 HTML JavaScript 例子展示了如何在网页中使用这个无服务器函数。

它通过 ID csv_datatextarea 字段获取 CSV 数据,向无服务器函数发出 AJAX HTTP POST 请求,然后把返回值(一个 SVG 图形)放入 ID 为 svg_img 的 HTML 元素中。点击这里查看 demo。

$.ajax({method: "POST",url: "https://service-m9pxktbc-1302315972.hk.apigw.tencentcs.com/release/PCASVG",data: $('#csv_data').val(),dataType: "text"
}).done(function(data) {$('#svg_img').html(data);
})

3e7eff0da30d9a455ceadd5ff121ee0f.png

接下来

腾讯的 SCF Custom runtime 是一个非常强大的无服务运行环境。它为你想要编写的任何应用程序函数提供了一个通用的 Linux 环境,并提供了标准的 web 接口来与函数的输入和输出进行交互。这绝对值得一试。

正如本文所讨论的,我们相信 Rust 和 WebAssembly 为无服务器函数提供了一个高性能、安全、可移植、面向未来的堆栈。Rust、WebAssembly 与 SCF costum runtime 代表了未来!

One More Thing

立即体验腾讯云 Serverless Demo,领取 Serverless 新用户礼包 serverless/start

欢迎访问:Serverless 中文网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SChema中group指示器的使用

<?xml version"1.0" encoding"UTF-8"?> <!-- edited with XMLSpy v2011 (http://www.altova.com) by qmy (sigmartix) --> <xs:schema xmlns:xs"http://www.w3.org/2001/XMLSchema" elementFormDefault"qualified" a…

java ee项目部署到服务器上405,HTTP状态405 - HTTP POST方法不受此URL支持:采用的GlassFish服务器的NetBeans...

I am getting this error on using post method in my form-- HTTP Status 405 - HTTP method POST is not supported by this URL.我register.html文件如下&#xff1a;Register formName:Email ID:Password:我Register.java servlet代码是如下package Glassfish;import java.…

ceb怎么转换成word_PDF怎么转换成Word?分享免费转换技巧!

PDF怎么转换成Word&#xff1f;pdf格式无法编辑众所周知的事&#xff0c;但如果我们需要将其进行编辑使用的话&#xff0c;就需要将pdf格式转换成word格式。可是怎么将pdf转换成word一直是件令人头疼的事&#xff01;所以今天小编给大家分享几个pdf转word免费转换技巧&#xff…

[FZYZOJ 1038] 隧道

P1038 -- 隧道 时间限制&#xff1a;1000MS 内存限制&#xff1a;65536KB Description 一座小镇正在着手建造自己的地铁线路网。小镇坐落在许多小岛上&#xff0c;小岛之间通过隧道或者桥梁连接。地铁就在这些已有的桥梁和隧道的基础上建成。由于地铁主要是在地下&#xf…

音创ktv点歌系统服务器,音创ktv点歌系统家庭版

光行资源网为用户提供的音创ktv点歌系统电脑版是为ktv和家庭影院专门设计打造的点歌软件&#xff0c;相信很多朋友们都去过ktv点歌&#xff0c;大家点歌时的界面就是专门的点歌系统。特色1、方便性&#xff1a;安装调试简单方便&#xff0c;减少了您购买后所带来的多种维护烦恼…

7极限精简版64位_DNF:国服更新64位客户端深度体验,真的有如此丝滑吗?

DNF最新最快资讯&#xff0c;最全最细攻略&#xff0c;尽在骑乌龟的蜗牛12年&#xff0c;地下城的游戏客户端终于获得了升级&#xff0c;从32位更新到了64位&#xff0c;关于更新带来的游戏好处大家应该都在很多地方看过&#xff0c;而国服正式服也终于在8.20版本的更新中将客户…

MYSQL BENCHMARK函数的使用

MYSQL BENCHMARK函数是最重要的函数之一&#xff0c;下文对该函数的使用进行了详尽的分析&#xff0c;如果您对此感兴趣的话&#xff0c;不妨一看。 下文为您介绍的是MYSQL BENCHMARK函数的语法&#xff0c;及一些MYSQL BENCHMARK函数相关问题的测试&#xff0c;供您参考学习。…

服务器无法通过系统非页面共享区进行分配,服务器无法通过系统非页面共享区来进行分配的解决方法...

服务器开始阶段性的出现死机状态了。隔一段时间就无法连接了。重启后正常&#xff0c;过一段时间又是同样的问题。事件查看器中有大量的同样报错&#xff1a;事件ID&#xff1a;2020描述&#xff1a;服务器无法通过系统页面共享区来进行分配&#xff0c;因为共享区当前是空的。…

iou画 yolov3_专栏 | 【从零开始学习YOLOv3】4. YOLOv3中的参数进化

原标题&#xff1a;专栏 | 【从零开始学习YOLOv3】4. YOLOv3中的参数进化前言&#xff1a;YOLOv3代码中也提供了参数进化(搜索)&#xff0c;可以为对应的数据集进化一套合适的超参数。本文建档分析一下有关这部分的操作方法以及其参数的具体进化方法。1. 超参数YOLOv3中的 超参…

ORACLE中的异常处理

异常的语法格式 在begin语句内&#xff1a; exception when then when then when others then --异常处理 --首先创建一份对象的用法 create type xtype as object (name varchar2(20)); declare x xtype; begin x.name:aaa; exception when ACCESS_INTO_NULL then dbms_…

文件已经上传到服务器翻译,服务器接受上传的优化 翻译+源码分析

一般的做法err : r.ParseMultipartForm(32 << 20) // 32Mbif err ! nil {http.Error(w, err.Error(), http.StatusBadRequest)}问题请注意&#xff0c;32Mb是分配给请求体的字节存储在内存中&#xff0c;而不是请求体的限制&#xff0c;当满(33Mb)时&#xff0c;它将写入…

隐藏a标签seo_让黑帽都惊了,远离百度惩处的seo技术

一、什么是黑帽SEO黑帽SEO&#xff0c;即SEO作弊&#xff0c;是指为了提高网站在搜索引擎中展现机会和排名的目的&#xff0c;欺骗搜索引擎的行为“黑帽”技术与搜索引擎算法相排斥&#xff0c;是搜索引擎不允许的。一旦被发现使用“黑帽”技术&#xff0c;那么网站排名会被降低…

前端学习(1501):一次帮别人解决问题的案例

超开心 只能添加姓名 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </…

PHP的time函数返回时间不正确

PHP的time()得到的时间与当前时间相差很多&#xff0c;检查了PHP.ini&#xff0c;发现是时区不对。在PHP.ini中&#xff0c;当前设置为&#xff1a; [Date]; Defines the default timezone used by the date functions; http://php.net/date.timezonedate.timezone Europe/Par…

微信小程序服务器sessionid,微信小程序sessionid不一致问题解决

微信小程序sessionid不一致问题解决,里加,两次,在后面,解决办法,缓存微信小程序sessionid不一致问题解决易采站长站&#xff0c;站长之家为您整理了微信小程序sessionid不一致问题解决的相关内容。问题由于小程序端两次请求的 sessionid 不一致&#xff0c; 导致后端无法取得 s…

mysql 加字段_MySQL8.0大表秒加字段,是真的吗?

前言&#xff1a;很早就听说 MySQL8.0 支持快速加列&#xff0c;可以实现大表秒级加字段。笔者自己本地也有8.0环境&#xff0c;但一直未进行测试。本篇文章我们就一起来看下 MySQL8.0 快速加列到底要如何操作。1.了解背景信息表结构的变更是业务运行过程中比较常见的需求之一&…

SQLServer学习笔记系列4

一.写在前面的话 好多天没有记录sql学习笔记了&#xff0c;要坚持下去&#xff0c;坚信每一点的进步都是为在积蓄力量。今天看到一幅图&#xff0c;特此分享出来。 通过这幅图&#xff0c;我看到的是每人站在自己的角度看问题&#xff0c;感受是不一样的&#xff0c;就如同学习…

随便选一张扑克牌_扑克牌魔术手法教学,简单易学的纸牌魔术,三分钟让你成为大师...

标签&#xff1a; 魔术手法 扑克牌魔术 魔术技巧教学 纸牌魔术揭秘所有的纸牌魔术家都知道怎样假装把一张牌塞进牌堆&#xff0c;然后从顶部翻出来来让观众吃惊。这个技巧用来练习手速、手指灵敏度、适时分散观众注意力和表演艺术绝对是不可或缺。这里就给大家介绍一下吧&#…

JAVA求集合中的组合

好几个月没弄代码了&#xff0c;今天弄个求组合的DEMO 思路是将集合的每个值对照一个索引&#xff0c;索引大小是集合的大小2.索引默认为[000...000]&#xff0c;当组合后选取的组合值demo为[0100..00]。然后根据遍历索引来到集合中取值。 上代码&#xff1a; import java.util…