Web和云开发,Rust会起飞?

Web和云开发,Rust会起飞?

一、前言

二、大厂偏爱,Rust的未来

三、Rust做Web的雄心

四、有必要换Rust做Web?

1.效率和性能

2.可靠性和可维护性

五、Rust先苦后甜

六、用Rust前的几个问题

七、开发界的强者

一、前言

去年,Web开发公司Mainmatter对Web版 Rust 进行了战略押注,并发起了 EuroRust 会议,加入了 Rust 基金会,同时正在内部以及开源领域从事许多 Rust 项目。

Mainmatter非常乐观地认为 Rust 将在未来几个月和几年内在Web和云空间中起飞,并认为Rust 是迈向 Web 开发新时代的第一步,开发人员可以利用这项技术,在不放弃开发人员经验和生产力的情况下,达到更高的、以前难以想象的效率、稳定性、可靠性和可维护性水平。

这篇文章意在分享为什么Mainmatter有信心作这一押注,以及为什么我们相信 Rust 在Web和云领域拥有美好的未来。

 

二、大厂偏爱,Rust的未来

Rust 自从大约十年前登台以来,就受到了很多开发人员的关注和喜爱。不仅开发人员喜欢这门语言,大公司的决策者也认为 Rust 是一项伟大的技术,并且在过去几年里,该语言在整个行业得到了广泛采用。

AWS在其平台上大量使用 Rust ,Google在 Android 中使用它,Microsoft在 Windows 中使用它。从本质上讲,Rust 有望在以前使用的许多领域取代 C 和 C++:系统编程、操作系统、各种嵌入式系统、低级工具以及游戏和游戏引擎。

当然,除了以上这些,未来具有更大潜力的领域是Web和云。Rust给这两个领域带来了无限想象的后端提升空间。一旦后端的开发提升到一个新的水平,就能让团队能够访问以前无法实现的功能。

尽管 Rust 还很年轻,但已经看到很多公司在Web和云中成功使用 Rust,比如:Truelayer、Discord、Temporal、Nando's、svix、Wingback等等。

值得一提的是,谷歌多年来也一直大力采用 Rust,最近表示,与他们使用的任何其他语言相比,他们并没有真正看到 Rust 的生产力损失。

三、Rust做Web的雄心

虽然相对年轻,毕竟距离1.0 发布,Rust的生态系统也只走过了 8 年。但Rust以及其Web生态已经达到了一定的成熟度,足够使其成为构建真实应用程序的可行选择。

正如arewewebyet.org所证实的,Rust 显然已经为Web做好了准备:

首先,有tokio,一个异步运行时,它是Web应用程序的坚实且高性能的基础;其次,最重要的是,Rust已经有了成熟且维护良好的 Web 框架,例如axum和actix-web。所有相关数据存储以及 ORM 都有成熟的驱动程序;最后,可以找到涵盖构建 Web 应用程序的所有其他相关方面的库,例如(反)序列化、国际化、模板化、可观察性等。

总的来说,Rust的雄心勃勃,构建 Web 后端提供了坚实而稳定的构建块。

四、有必要换Rust做Web?

当然,有人可能会问:我为什么要换Rust?对于已经使用 Ruby、Java、Elixir、TypeScript、Go 或其他任何语言的团队而言,换 Rust有哪些好处吗?

有两个关键方面使 Rust 成为 Web 构建的绝佳选择:一是它的效率和性能;二是其类型系统带来的可靠性和可维护性带来的好处。

1.效率和性能

Rust 以其高效和高性能而闻名。它将轻松超越 Web 应用程序常用的 JavaScript、Ruby、Python 等语言几个数量级。其他语言可能具有更高的性能上限(例如 Java 或 C# 或 Go),但你需要投入大量的工程精力才能接近 Rust 工具包开箱即用提供的性能水平。

此外,Rust 还有一个关键优势:它不捆绑垃圾收集器。垃圾收集语言可以很快,但它们不能始终一致性地表现出色。垃圾收集器将引入暂停(pause)以释放未使用的内存,从而对应用程序的尾部延迟产生负面影响。而Rust 不存在这个问题:它可以提供一致的性能,而不会出现这些峰值。

C 和 C++ 是唯一能够实现如此稳定和一致性能的其他语言。不幸的是,这两种语言往往搬起石头砸自己脚,处处是陷阱,特别是在手动内存管理时。正如 Linux 的创始人 Linus Torvalds 所说:

“它离硬件太近了,你可以用它做任何事情。这很危险。就像玩杂耍电锯一样。我还发现它确实有很多陷阱,而且很容易被忽视。

由于 C 和 C++ 的这些危险,除了这两种语言的专家或拥有专家团队时才能使用。否则,你得到的就是一个不稳定且充满安全漏洞的系统。

同时,别忘了,在 Web 领域,很少人具备这种专业知识,因为每个人大多都使用非常不同的语言,如 JavaScript、Python、Ruby、Elixir 等。反而Rust 就不会遇到同样的陷阱,使开发人员能够以以前的效率水平构建软件。

Rust 通常会比用于构建 Web 后端的其他技术的性能好几个数量级,同时保持显着较低的内存占用。

当然,如果与其他技术相比, Rust Web 服务器可以在一小部分时间内响应请求,这也意味着它可以用更少的服务器响应相同数量的请求,这又意味着更少的托管成本。

这对于中小型产品和公司来说,减少托管的云服务器数量,就意味每月就可以轻松减少不菲的费用。

我们的 Python 服务平均约为 50 个请求/秒,NodeJS 约为 100 个请求/秒,Rust 约为 690 个请求/秒。我们可以在通常托管单个 Python 服务的 k8 EKS 节点上安装 4 个 Rust 服务。——Reddit某用户这样说

然而,成本节省还只是好处之一,使用更少的服务器也意味着使用更少的能源。尽管使用可再生能源运行数据中心固然很好,但最绿色的能源仍然是我们不使用的能源。Rust 或许不能解决气候危机,但这里要承认的是,运行我们编写的软件,也会真真切切地消耗资源,从而对现实世界产生影响。软件行业往往会忘记这一点——如果我们能够更有效地利用资源,并以更少的投入获得相同的产出,这是选择技术时的一个重要考虑。

 

2.可靠性和可维护性

虽然性能和效率很重要,但在许多情况下,可能更相关的原因则是 Rust 的强类型系统所带来的可靠性和可维护性收益。

像这样的代码片段对于 Web 应用程序(Ruby on Rails)来说是相当典型的:

class Userattr :nameattr :activeattr :activation_datedef activate(activation_date)self.active = trueself.activation_date = activation_datesaveenddef save…end
end…user.activate(Time.now)

虽然这段代码非常简洁且易于阅读,并且编写这样的代码可以让你快速实现目标,但也存在问题。在这个的示例中,虽然我们可以看到用户的属性,但我们不知道这些属性周围可能有什么规则(例如,如果active是true,则activation_date可能也必须设置?如果active是false,则大概activation_date应该是nil?)。为了验证这些假设,我们必须研究该activate方法的实现,这意味着需要付出相对较高的努力才能获取信息。

查看该activate方法的调用,我们无法知道它是否会引发错误,或者我们应该在哪个时区中度过时间。虽然 Ruby 可能有点极端,但考虑到其众所周知的灵活性,许多这些问题在其他语言中也存在。让我们以 Java 为例。我们仍然无法在类型系统中对围绕active和activation_date属性的规则进行编码,即使可以null,我们也有NullPointerException在运行时获取 s 的风险。

随着代码库的增长和开发团队的壮大,或者只是随着一些人离开和加入而发生变化。从事代码库工作的每个人都对整个应用程序以及整个代码库中所做的所有隐式假设都有一个完美的心智模型,但这很难做到,相反,理解这些概念需要人们认真阅读遗留代码。这不仅降低了效率,而且还可能导致生产中的错误率增加。

与上面相同的代码片段,但在 Rust 中更加清晰和富有表现力:

enum User {Inactive {name: String,},Active {name: String,active: bool,activation_date: DateTime<Utc>,},
}impl User {fn activate(&self, activation_date: DateTime<Utc>) -> Result<(), DBError> {match self {User::Inactive { name } => {let new_user = User::Active {name: name.clone(),active: true,activation_date: activation_date,};new_user.save()}User::Active { .. } => Err(Error::default()),}}fn save(&self) -> Result<(), DBError> {…}
}

首先,对于用户模型,我们可以使用 Rust 的enum关联数据。这样,就可以完全清楚非活跃用户和活跃用户是什么样子,以及在什么场景下可以设置哪些属性——事实上,活跃用户和非活跃用户甚至不具有相同的属性,但每个用户都只具有对其有意义的属性。它们代表各自的用户状态。此外,属性的类型也被明确定义——不仅 Rust 是类型化的,而 Ruby 显然是非类型化的,而且类型也非常精确,例如对于字段,activation_date预期的时区在类型中也是正确的。

该函数的签名activate还显式地编码了 Rails 示例中隐含的许多信息。同样,预期的时区activation_date在类型中是正确的,并且该函数返回Rust 的时区Result,这清楚地表明调用它时可能会发生错误。Result事实上,Rust 编译器将要求处理的成功和错误变体,以便不会发生未处理的运行时异常。

此外,activation_date当调用函数时,函数的参数总是保证有一个值,因为 Rust 没有隐式可空性的概念(与 Java 不同)。如果activation_date 可能在其计算位置没有值,则它可能无法Option<DateTime<Utc>>传递给函数activate,因为它的类型与预期的不同DateTime<Utc>。Rust 编译器只允许Some其变体的代码路径Option导致方法的调用activate,以便activation_date保证在函数运行时有一个值。

虽然这显然是一个相当简单的示例,但它很好地说明了 Rust 的两个主要优点:

(1)Rails 示例中隐含的许多概念和规则都是通过 Rust 代码中的类型显式传达的。可以清楚地区分活跃用户和非活跃用户,对于日期字段,甚至预期的时区也被编码在类型中。这种表现力使代码更容易理解,特别是对于代码库的新手来说,从而提高了可维护性。

(2)Rust 还大大提高了可靠性,因为其他语言(包括 Java 或 Go 等类型化语言)中常见的整类错误将在编译时而不是运行时检测到。编译器保证函数activation_date的参数activate具有值以及要处理的函数可能返回的任何错误。

总体而言,当每个人都关注 Rust 的性能时,Rust 带来的可靠性和可维护性方面的改进常常被忽视。然而,这些好处对于项目的长期成功可能比纯粹的绩效数字更相关。

五、Rust先苦后甜

由于 Rust 的主要优点是可靠性、可维护性、效率和性能,因此该语言的用例显然是与这四个方面特别相关的用例。但是,好处的代价是需要考虑在内。

总体而言,Rust 仍然需要比其他技术更高的前期投资,特别是与 Web 项目中常用的技术相比:

虽然像 JavaScript 和 Ruby 这样的语言是为了快速获得结果而设计的,但 Rust 则没有留下太多的自由度,并且要求程序在获得工作结果之前通过所有编译器的检查。与这些语言相比,使用 Rust 就需要付出更多的初始工作。此外,人们在使用 Rust 之前还需要翻越一座山——那就是掌握 Rust 独特的所有权系统。

然而,当跨过项目的初始阶段并将视野扩展到更长的时间范围时,可维护性、可靠性和稳定性等方面变得极其重要,一开始使用 Rust 时进行的额外投资会随着时间的推移而带来回报——

Rust 应用程序更可靠,因此需要更少的时间投入到错误修复上,并且更易于维护,因此更容易与不断增长和变化的团队一起有效地工作。

最后就会呈现出:Rust工作量先大后小,先苦后甜。对于其他语言来说,情况往往是相反的:随着时间的推移,随着团队的成长,可靠性和可维护性挑战的影响变得更大、成本更高,工作量也会增加。

 

六、用Rust前的几个问题

根据 Rust 的优势和投入曲线,每当评估是否针对特定情况选择 Rust 时,需要回答的主要问题是:

(1)团队是否已经具备 Rust 专业知识(许多不使用 Rust 的团队实际上已经拥有专业知识,因为很多开发人员在空闲时间使用 Rust 编写代码)?

(2)可靠性方面有哪些要求?

(3)长期维护计划是什么?

(4)系统构建的规模有多大,Rust 在托管方面可以节省多少钱?

(5)根据以上问题的答案,额外的初始投资值得吗?

虽然在某些情况下,结论是额外的初始投资不值得,但在某些情况下,评估显然对 Rust 有利。我们看到的一些典型用例包括:

(1)对于实现产品关键业务逻辑的核心业务系统来说,可靠性、长期可维护性等方面是首要考虑的问题。

(2)对于金融系统来说,通常对错误的容忍度很低,而 Rust 带来的稳定性的提高可能是一个决定性因素。另外,性能是一项关键要求,在特定场景(例如交易系统)中具有明显的财务影响。

(3)任何必须能够提供高吞吐量和性能的系统显然都会从 Rust 中受益。位于多个微服务前面的代理服务器等系统必须具有最小的开销和一致的性能。在这些情况下,垃圾收集语言及其不可靠的性能特征通常不是一个选择。

(4)最后,对于任何大规模运行的系统,在托管成本方面都有很大的节省潜力。

一旦做出了使用 Rust 的决定,就有两种主要的采用路径——要么用 Rust 从头开始(重新)编写整个应用程序,要么考虑与其他技术一起逐步采用。篇幅原因,就不再展开了。

七、开发界的强者

JNPF,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

低代码是将开发过程中某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。因而极大的提高了程序员的生产效率。

官网:www.jnpfsoft.com/?csdn ,如果你有闲暇时间,可以做个知识拓展。

采用业内领先的SpringBoot微服务架构、支持SpringCloud模式,完善的平台扩增基础,满足了系统快速开发、灵活拓展、无缝集成和高性能应用等综合能力;采用前后端分离模式,前端和后端的开发人员可分工合作负责不同板块。

为了支撑更高技术要求的应用开发,从数据库建模、Web API构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动

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

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

相关文章

小研究 - 主动式微服务细粒度弹性缩放算法研究(二)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…

工博士与纷享销客达成战略合作,开启人工智能领域合作新篇章

近日&#xff0c;工博士与纷享销客在上海正式签署了战略合作协议&#xff0c;正式拉开了双方在人工智能与数字营销领域的合作序幕。这次合作将为双方带来更多机遇和发展空间&#xff0c;并为全球人工智能领域的客户提供更高效、智能的CRM解决方案。 < 双方项目人员合影 >…

【分布式共识算法】Basic Paxos 算法

basic paxos算法&#xff1a;描述的是多个节点就某个值达成共识。 muti-paxos 算法&#xff1a;描述的是执行多个basic paxos实例&#xff0c;就一系列值达成共识。 共识其实&#xff0c;比如当多个客户端请求服务器&#xff0c;修改同一个值X 多个阶段达成共识。 原理 角色…

07_Hudi案例实战、Flink CDC 实时数据采集、Presto、FineBI 报表可视化等

7.第七章 Hudi案例实战 7.1 案例架构 7.2 业务数据 7.2.1 客户信息表 7.2.2 客户意向表 7.2.3 客户线索表 7.2.4 线索申诉表 7.2.5 客户访问咨询记录表 7.3 Flink CDC 实时数据采集 7.3.1 开启MySQL binlog 7.3.2 环境准备 7.3.3 实时采集数据 7.3.3.1 客户信息表 7.3.3.2 客户…

【CTF-web】备份是个好习惯(查找备份文件、双写绕过、md5加密绕过)

题目链接&#xff1a;https://ctf.bugku.com/challenges/detail/id/83.html 经过扫描可以找到index.php.bak备份文件&#xff0c;下载下来后打开发现是index.php的原代码&#xff0c;如下图所示。 由代码可知我们要绕过md5加密&#xff0c;两数如果满足科学计数法的形式的话&a…

图片懒加载指令-vueUse

基于Vue的自定义钩子集合 https://vueuse.org/ 适用于Vue 3和Vue2.7版本之后 基于vueUse定义懒加载指令

ByteBuffer 使用

ByteBuffer 使用 1 java.nio包中的类定义的缓冲区类型2 缓冲区常用属性2.1缓冲区的容量(capacity)2.2 缓冲区的位置(position)2.3 缓冲区的限制(limit)2.4 缓冲区的标记(mark)2.5 剩余容量 remaining/hasRemaining 3 缓冲区常用方法3.1 创建缓冲区3.1.1 allocate方法3.1.2 wrap…

NLP语言模型概览

语言模型结构分类 Encoder-Decoder&#xff08;Transformer&#xff09;: Encoder 部分是 Masked Multi-Head Self-Attention&#xff0c;Decoder 部分是 Casual Multi-Head Cross-Attention 和 Casual Multi-Head Self-Attention 兼具。比如T5&#xff0c;BART&#xff0c;MA…

美能达打印机刷卡扫描文件后,用户收不到扫描邮件

环境: 柯尼卡美能达一体机 bizhub 287 域服务器 Windows server 2019 问题描述: 新员工在域服务器创建账户后同步到打印服务器上面,他们在打印机扫描文件后,自动发邮件那个邮箱上没有他们邮件,导致他们也收不到邮件 正常是用户在打印机上刷卡后扫描件文件为PDF格式,…

Python系统学习1-9-类一之类语法

一、类之初印象 1、类就是空表格&#xff0c;将变量&#xff08;列名&#xff09;和函数&#xff08;行为&#xff09;结合起来 2、创建对象&#xff0c;表达具体行 3、创建类就是创建数据的模板 --操作数据时有提示 --还能再组合数据的行为 --结构更加清晰 4、类的内存分配…

uniapp中map使用点聚合渲染marker覆盖物

效果如图&#xff1a; 一、什么是点聚合 当地图上需要展示的标记点 marker 过多时&#xff0c;可能会导致界面上 marker 出现压盖&#xff0c;展示不全&#xff0c;并导致整体性能变差。针对此类问题&#xff0c;推出点聚合能力。 点聚合官网教程 二、基本用法 template…

一生一芯4——使用星火应用商店在ubuntu下载QQ、微信、百度网盘

星火应用商店可以非常方便的完成一些应用的下载&#xff0c;下面是官方网址 http://spark-app.store/download 我使用的是intel处理器&#xff0c;无需下载依赖项&#xff0c;直接点击软件本体 我这里下载amd64,根据自己的处理器下载对应版本 sudo apt install ./spark-stor…

sklearn机器学习库(二)sklearn中的随机森林

sklearn机器学习库(二)sklearn中的随机森林 集成算法会考虑多个评估器的建模结果&#xff0c;汇总之后得到一个综合的结果&#xff0c;以此来获取比单个模型更好的回归或分类表现。 多个模型集成成为的模型叫做集成评估器&#xff08;ensemble estimator&#xff09;&#xf…

代码随想录算法训练营第四十二天|LeetCode 121,122

目录 LeetCode 121.买卖股票的最佳时机 动态规划五步曲&#xff1a; 1.确定dp[i][j] 的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历方向 5.打印dp数组 LeetCode 122.买卖股票的最佳时间II 动态规划五步曲&#xff1a; 1.确定dp[i][j] 的含义 2.找出递推公式 3.初始化dp数组…

[K8s]问题描述:k8s拉起来的容器少了cuda的so文件

问题解决&#xff1a;需要设置Runtimes&#xff1a;nvidia的同时设置Default Runtimenvidia

SpringCloud实用篇7——深入elasticsearch

目录 1 数据聚合1.1 聚合的种类1.2 DSL实现聚合1.2.1 Bucket聚合语法1.2.2 聚合结果排序1.2.3 限定聚合范围1.2.4 Metric聚合语法1.2.5.小结 1.3 RestAPI实现聚合1.3.1 API语法1.3.2 业务需求1.3.3 业务实现 2 自动补全2.1 拼音分词器2.2 自定义分词器2.3 自动补全查询2.4 实现…

git一次错误提交的回滚(不同分支因merge-需回滚)

—————————————————————————————— 注意&#xff01;注意&#xff01;注意&#xff01;git revert的坑&#xff08;能不revert千万不要操作&#xff09; —————————————————————————————— 场景&#xff1a;提交到…

Express 实战(一):概览

在正式学习 Express 内容之前&#xff0c;我们有必要从大的方面了解一下 Node.js 。 在很长的一段时间里&#xff0c;JavaScript 一门编写浏览器中运行脚本的语言。不过近些年&#xff0c;随着互联网的发展以及技术进步&#xff0c;JavaScript 迎来了一个集中爆发的时代。一个…

图数据库_Neo4j基于docker服务版安装_Neo4j Desktop桌面版安装---Neo4j图数据库工作笔记0004

然后我们来看看如何用docker来安装Neo4j community server 首先去执行docker pull neo4j:3.5.22-community 去拉取镜像 然后执行命令就可以安装了 可以用docker ps查看一下 看看暴露了哪些端口 然后再看一下访问一下这个时候,要用IP地址了注意 然后再来看一下安装Desktop 去下…

竞赛项目 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …