引言
今年 Amazon Lambda 迎来了它的第一个十周年。在过去的十年里,无服务器架构改变了软件开发的方式,简化了应用程序的部署和扩展,成为云计算的新引擎。而在众多支持无服务器技术的编程语言中,Rust 以其卓越的安全性和高性能成为了开发者的宠儿。在这篇博客中,我们将探讨 Rust 如何在无服务器架构中发挥关键作用,并展望未来无服务器技术的发展方向。
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!
无服务器架构的演变
Amazon Lambda 于 2014 年正式面向 Amazon Web Services 上的构建者提供服务,标志着无服务器计算的开始。无服务器架构允许开发者无需管理服务器即可运行代码,从而专注于业务逻辑的开发。这种模式极大地提高了开发效率,并降低了运营成本。
在过去的十年中,无服务器架构经历了显著的发展,从简单的事件驱动计算扩展到复杂的分布式系统。随着需求的不断增长,开发者对性能和安全性的要求也越来越高。这就是为什么 Rust 在无服务器技术中脱颖而出。
什么是 Rust
Rust 作为一门编程语言,一直以来,都有一群忠实的开发者粉丝群。他们选择 Rust 的原因在于 Rust 的安全性,高性能以及高效并发。尤其云计算蓬勃发展的近些年,Rust 凭借其独特的技术优势,逐渐成为了构建云基础设施的"香饽饽"。亚马逊云科技作为一家云供应商也对 Rust 这门编程语言情有独钟。
Rust 的安全性优势
Rust 的设计初衷就是解决内存安全问题。传统语言如 C 和 C++,尽管性能出色,但容易引发内存泄漏和数据竞争等问题。Rust 通过其独特的所有权系统和编译时检查,彻底消除了这些隐患。
在 Amazon Lambda 等无服务器环境中,安全性至关重要。应用程序可能会处理敏感数据,或在公共网络上运行。Rust 的内存安全特性确保了在编译时就能检测到潜在的安全漏洞,减少了运行时错误的可能性。这使得开发者在部署时更加安心。
Rust 的内存安全机制是基于"所有权"和"借用"两个核心概念。每个值都有一个"所有者",而"所有者"负责在合适的时候释放内存。同时,Rust 通过"借用"机制,允许多个引用同时访问一个值,但不会出现数据竞争的问题。这种精妙的设计,确保了 Rust 程序在运行时不会出现空指针、内存泄漏等非常常见的内存问题。统计数据显示,高达 70% 的关键安全漏洞都源自内存错误,所以 Rust 无疑是一股强大的"免疫细胞",为云服务筑起了坚实的防线。Amazon S3 就是用 Rust 构建的,Rust 的安全性对 Amazon S3 这系统的可靠性起着重要作用。
除了内存安全机制,Rust 强类型系统减少了运行时错误,增加了代码的可靠性和可维护性。
Rust 的高性能表现
除了安全,Rust 在性能方面也有着出色的表现。作为一门无垃圾回收的系统级语言,它可以直接编译为原生机器码,没有任何运行时开销。这使得 Rust 具有接近 C/C++ 的性能,在某些场景下甚至可以超越。
无服务器架构要求快速的启动时间和高效的资源利用。Rust 的无运行时架构使其在性能上具有显著优势。在 Amazon Lambda 的冷启动测试中,Rust 的启动时间几乎是瞬时的,这在需要快速响应和高并发的应用程序中尤为重要。
此外,Rust 的编译器优化和零开销抽象使得它在执行效率上优于许多其他语言。开发者可以利用 Rust 的并行处理能力,在不牺牲安全性的前提下,最大化地利用计算资源。
一位 Amazon Web Services Hero 做了一项测试,他使用不同 Amazon Lambda 运行时运行同等工作负载 25 亿次,结果如下图所示。Rust 的表现非常出色。事实上,它使用了大约四分之一的内存,但性能仍然优于其他实现。
因为高性能的表现,Rust 在无服务器环境中被广泛应用。举个例子,一个简单且典型的数据库应用。通过 Lambda 函数调用 DynamoDB 数据库,实现列举,选择,生成并删除产品信息。亚马逊云科技的架构师同学分别用 TypeScrip,Java,Go,Rust 以及 Kotlin 多种语言实现了这个应用程序。在他们共同努力运行了几万次后有了以下的运行结果:
首先很自豪的是,就热启动的响应时间来说,对大多数工作负载 Lambda 的运行速度非常快。无论哪个运行时,在稳定的状态下,都能获得高性能。另外 Rust 相对其他语言在性能助力上更胜一筹。有个小插曲是 Kotlin 好像表现更棒。究其原因,其实源于一个测试时将 Kotlin 变现的应用程序的 Lambda RAM 分配成了 2GB,其他语言包括 Rust 编写的应用程序 Lambda RAM 都给了 128MB。大家知道 Lambda 调用 CPU 时会给更多 RAM 的函数提供更多的计算量。我就奇怪,Rust 没有垃圾回收器,也没有运行时怎么可能比其他语言的性能差?!
再来看看 Lambda 在冷启动过程中,不同语言对于响应时间性能影响的比较。Lambda 冷启动是指函数第一次被调用时,需要启动一个新的运行环境,这个过程通常比较慢,因为需要完成一大堆的工作。比如:初始化 Lambda 运行时环境,包括加载必要的依赖库。设置 Lambda 函数的配置信息,如内存大小,超时时间等。再比如下载 Lambda 函数的代码包,反序列化代码包,并将其加载到新的运行中去。以及初始化 Lambda 函数上下文等等。这些步骤为请求做好准备,让这些运行时的托管环境就绪,以便交付响应。对 Go 而言,需要运行一个垃圾收集器,让它与应用程序一起启动,这无疑增加了冷启动的响应时间。TypeScript 也是如此,因为它有一个解释器需要一起启动。Java 更夸张,它甚至需要本地代码实现,即使在本地运行 Java 的 Lambda 函数,仍需要加载 JVM 和大量的依赖库,初始化开销特别大。
Rust 助力无服务器成为云计算的新引擎
我们认为,Lambda 是无服务器计算,而无服务器不仅仅是 Lambda。亚马逊云科技为云上构建者运行和构建现代应用程序提供最广泛的无服务器服务组合。
而亚马逊云科技一些明星云服务,如 S3 和 Fargate,都在使用 Rust 进行性能优化和安全强化。不仅如此,Amazon Web Services 还广泛采用 Rust 来开发关键的底层组件,比如,Bottlerocket 是一个基于 Rust 的容器优化操作系统,为 Amazon EKS 提供支撑。Firecracker 是支撑 Lambda 和 Fargate 的虚拟化引擎,同样采用了 Rust 进行开发。可以说,Rust 已经深入到 Amazon 云计算的"脊梁"之中,成为构建下一代云基础设施的关键力量。
除了这些基础设施级的服务和应用,Rust 在 Amazon Web Services 服务开发中也扮演着重要角色。Amazon SDK for Rust 就是一个很好的例子。利用这个 SDK,开发者可以轻松地与 Amazon Web Services 提供的各项云服务集成,构建复杂的分布式系统。
值得一提的是,Amazon Web Services 不仅积极使用 Rust,也在大力支持 Rust 生态系统的发展。Amazon Web Services 是 Rust 基金会的董事会成员,并为 Rust 基金会提供基础设施和技术支持。同时,Amazon Web Services 也雇佣了多名 Rust 项目的核心贡献者,协助改进 Rust 语言和重要库,如 tokio。这些努力无疑将推动 Rust 在云计算领域的进一步应用和普及。
- 查看更多基于 Rust 的开源项目
展望未来:Rust 与无服务器技术的结合
在 Amazon Lambda 十周年之际,我们回顾过去的成就,同时展望未来的创新。Rust 作为 Amazon Lambda 的动力与安全保障,正在引领无服务器技术的新方向。有了 Rust 为无服务器技术在安全性和高性能打下坚实基础,未来的无服务器架构将更加强调资源效率和可持续发展,而 Rust 的低能耗特性也正好契合这一趋势。
我们可以看到 Rust 正在成为 Amazon Web Services 为代表的云计算服务的重要"引擎"。它出色的性能、安全性和可持续性,使其成为构建可靠、高效云基础设施的理想选择。同时可靠高效的云也为开发者的专注创新提供了更多的可能性。
让我们一起在云上开心构建吧!
文章来源:Rust 助力无服务器构筑云计算新引擎