部署Rust工程到阿里云函数计算FC

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 阿里云函数计算目前支持C#、Java、Python、Go等大部分语言,对于Rust没有直接支持,不过可以通过Custom Runtime和Custom Container模式部署。

阿里云函数计算目前支持C#、Java、Python、Go等大部分语言,对于一些定时任务是非常适合的。最近有一些工程使用Rust重写了也想部署到阿里云函数计算上,这里来看可以使用Custom Runtime/Container。

Custom Runtime/Container模式

这个模式本质上是自定义脚本启动一个http服务,然后Serverless平台转发请求到你的http服务,这个请求header中有一些特殊信息,极端的将不考虑启动速度和性能等等,其实是可以无障碍迁移大部分服务的(存储和数据库可能需要改造)。

这个运行环境默认包含了Python3,Java 8等常见依赖,对于Rust这种编译成二进制文件的就更简单了。最终产物是一个zip包,包含启动文件bootstrap和其他依赖即可。

Custom Container模式可以理解成增强模式,如果Custom Runtime不可用,一般是由于特殊的本地依赖导致,Custom Container模式的产出是一个镜像,不过由于镜像的大小比代码包大,所以计费上要多一些,包含拉取镜像的费用。所以这两者需要根据情况来决策,尽可能使用Runtime模式。这样费用和速度上都好一些。

代码改造

这里使用的是funcraft工具专门用于部署,template.yml文件包含描述信息,代码放在code目录。

在Cargo.toml中新增两个依赖

tokio = { version = "1.12.0", features = ["full"] }
warp = "0.3.0"

修改main.rs用warp启动一个http服务

async fn main() {

pretty_env_logger::init();  
// POST /invoke  
let route = warp::path!("invoke")  
    .and(warp::post())  
    .and_then(handler::run);  

info!("Starting server ...");  
warp::serve(route).run(([0, 0, 0, 0], 9000)).await;  

}

其中handler:run就是原来代码入口,签名如下

pub async fn run() -> Result {
为了方便自动部署,代码构建用了Docker (FROM rust:1),加一个Makefile如下

build-img:

docker build -t fc-rust-runtime  -f build-image/Dockerfile build-image  

build: build-img

docker run --rm -v $$(pwd):/tmp fc-rust-runtime bash -c "cd /tmp/code/ && cargo build --release && mv target/release/code bootstrap && chmod +x bootstrap && rm -rf target/"  

deploy: build

fun deploy -y  

这样直接执行make deploy即可。

优化代码包大小

因为代码包是需要拉取的,特别是冷启动时间,所以尽可能降低大小是有必要的。

首先是看下除了bootstrap以外其他文件是否可以删除,比如源文件(*.rs)就不需要,一般来说必要的文件常见的有log4rs.yml还有migration文件夹等,也可能只需要一个bootstrap就行了。

其次就是优化生成物本身的大小,cargo build –release本身包含了一些优化,但是为了更小的体积一般还会配置这些

[profile.release]
opt-level = "z"
lto = true
codegen-units = 1

最后就是strip,目前nightly可以直接使用,但是stable还是需要手动执行下,也可以使用cargo-strip。nightly配置如下

cargo-features = ["strip"]

[profile.release]
strip = "symbols"

参考

除了Rust以外,我还有一些Golang的函数,从体验上看部署流畅度和内存消耗Rust有一定优势,但是也不算很大,因为目前的计费方式上,内存最小是128M,相同功能的Golang函数平均比Rust多10M到20M,对于实际费用影响不大,定时任务对于时间敏感度也没有那么高。

参考文档:

https://help.aliyun.com/document_detail/132044.html

https://help.aliyun.com/document_detail/179367.html

https://github.com/htynkn/faas-collections/tree/master/update-forked-repo-rust

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
10天前
|
存储 人工智能 运维
正式收官!阿里云函数计算携手优酷,用 AI 重塑影视 IP 创新边界
近日,阿里云联合优酷发起的 Create@影视 IP x AI 应用创新大赛,将网剧《少年白马醉春风》这一热门影视 IP 与阿里云 AI 技术相结合,由阿里云函数计算提供 AIGC 技术支持参赛者基于网剧《少年白马醉春风》IP 或“少年江湖”精神内核,用 AI 生成角色场景设计、手办设计、破次元合照、数字人等多样化的作品。
|
12天前
|
消息中间件 JavaScript 中间件
函数计算产品使用问题否会自动进行打包部署
本文解答了五个关于阿里云函数计算的常见问题。包括:WebIDE编写的Node.js代码如何自动打包部署;如何为fc-stable-diffusion-plus开启API功能;如何在代码中主动结束实例并重启新实例处理触发器;如何在Koa中读取invoke事件消息;以及解决异步事件未触发的问题。提供了详细的解决方案和注意事项,帮助用户更好地理解和使用函数计算服务。[查看详情](https://developer.aliyun.com/ask/649609)
19 1
|
9天前
|
JSON Serverless 数据格式
体验函数计算一键部署 Flux 超写实文生图模型部署
体验函数计算一键部署 Flux 超写实文生图模型部署
|
9天前
|
JSON 物联网 Serverless
|
14天前
|
存储 运维 安全
函数计算产品使用问题之如何获取到访问其他阿里云服务所需的AccessKey、SecretKey或STS Token
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
14天前
|
运维 Serverless PyTorch
函数计算产品使用问题之ComfyUI除了通过WebUI页面进行,还有什么其他方法部署
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
12天前
|
Rust 安全 Go
揭秘Rust语言:为何它能让你在编程江湖中,既安全驰骋又高效超车,颠覆你的编程世界观!
【8月更文挑战第31天】Rust 是一门新兴的系统级编程语言,以其卓越的安全性、高性能和强大的并发能力著称。它通过独特的所有权和借用检查机制解决了内存安全问题,使开发者既能享受 C/C++ 的性能,又能避免常见的内存错误。Rust 支持零成本抽象,确保高级抽象不牺牲性能,同时提供模块化和并发编程支持,适用于系统应用、嵌入式设备及网络服务等多种场景。从简单的 “Hello World” 程序到复杂的系统开发,Rust 正逐渐成为现代软件开发的热门选择。
29 1
|
24天前
|
Rust 安全 编译器
初探 Rust 语言与环境搭建
Rust 是一门始于2006年的系统编程语言,由Mozilla研究员Graydon Hoare发起,旨在确保内存安全而不牺牲性能。通过所有权、借用和生命周期机制,Rust避免了空指针和数据竞争等问题,简化了并发编程。相较于C/C++,Rust在编译时预防内存错误,提供类似C++的语法和更高的安全性。Rust适用于系统编程、WebAssembly、嵌入式系统和工具开发等领域。其生态系统包括Cargo包管理器和活跃社区。学习资源如"The Book"和"Rust by Example"帮助新手入门。安装Rust可通过Rustup进行,支持跨平台操作。
初探 Rust 语言与环境搭建
|
12天前
|
Rust 安全 程序员
Rust 语言的防错机制太惊人了!安全编码从此不再是难题,快来一探究竟!
【8月更文挑战第31天】《安全编码原则:Rust 语言中的防错机制》探讨了代码安全的重要性,并详细介绍了Rust语言如何通过内存安全模型、所有权与借用规则等特性,在编译阶段检测并阻止潜在错误,如缓冲区溢出和悬空指针。文章还讨论了类型安全、边界检查等其他安全特性,并提出了遵循不可变引用、避免裸指针及充分测试等实用编码原则,以进一步提升代码质量和安全性。随着Rust在软件开发中的应用日益广泛,掌握其安全编码原则变得尤为重要。
26 0
|
12天前
|
Rust 安全 调度
从零构建梦想操作系统:用Rust语言亲手打造专属内核,你也可以成为系统开发者!
【8月更文挑战第31天】开发操作系统内核虽具挑战,却也充满乐趣。本文将指导你从零开始,使用Rust语言构建一个简单的操作系统内核。首先安装Rust环境和交叉编译工具链,然后创建新项目`my_kernel`。通过修改`Cargo.toml`和编写启动函数,结合串口输出和`multiboot2`库,最终使用QEMU运行内核。此教程旨在帮助你理解Rust在系统开发中的应用,激发深入探索的兴趣。
31 1

热门文章

最新文章