Web和云开发,Rust会起飞?

news2024/10/5 13:23:31

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 User
  attr :name
  attr :active
  attr :activation_date


  def activate(activation_date)
    self.active = true
    self.activation_date = activation_date
    save
  end


  def 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.coloradmin.cn/o/887342.html

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

相关文章

图卷积网络:GNN 深入探讨【02/4】

一、说明 在各种类型的GNN中&#xff0c;图卷积网络&#xff08;GCN&#xff09;已成为最普遍和应用最广泛的模型。GCN具有创新性&#xff0c;因为它们能够利用节点的特征及其局部性进行预测&#xff0c;从而提供了一种处理图形结构数据的有效方法。在本文中&#xff0c;我们将…

SkyEye操作指南:连接TI CCS的IDE调试

现代电力电子控制系统的开发中&#xff0c;DSP芯片以其优越的运算性能在控制算法领域得到越来越广泛的应用。传统的DSP开发过程往往需要在完成控制系统仿真与程序设计后&#xff0c;才能根据比对结果进行程序修改&#xff0c;全过程还需要硬件电路工程师的配合&#xff0c;开发…

线性代数再回顾

最近&#xff0c;在深度学习线性代数&#xff0c;之前大一的时候学过线性代数&#xff0c;但那纯属于是应试用的&#xff0c;考试一考完&#xff0c;啥都忘了&#xff0c;也说出不出个所以然&#xff0c;所以&#xff0c;在B站的MIT的线性代数以及3blue1brown线性代数的本质中去…

深入学习前端开发,掌握HTML、CSS、JavaScript等技术

课程链接&#xff1a; 链接: https://pan.baidu.com/s/1WECwJ4T8UQfs2FyjUMbxig?pwdi654 提取码: i654 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v4的分享 课程介绍&#xff1a; 第1周&#xff1a;HTML5基础语法与标签 &#x1f…

Nginx转发请求到后端服务报400 Bad Request

问题描述 系统部署好后&#xff0c;进行测试时发现有部分接口出错&#xff0c;项目采用Nginx作为后端代理服务器&#xff0c;有Nginx统一将请求转发到后端的网关服务&#xff0c;再由网关服务路由到具体的服务上&#xff0c;发布好后&#xff0c;大部分接口都是正常的&#xff…

使用Python将文本转换成语音?

使用Python将文本转换成语音&#xff1f; 超酷的Python应用&#xff1a;将文本转换成语音&#xff01;这不仅是一个有趣的项目&#xff0c;还能让你体验到Python的神奇之处。废话不多说&#xff0c;让我们开始动手吧&#xff01; 为什么要转换文本成语音&#xff1f; 在这个信…

Redis缓存!

一些基础芝士 将MySQL的热点数据存储在Redis中&#xff0c;通常业务都满足二八原则&#xff0c;80%的流量在20%的热点数据之上&#xff0c;所以缓存是可以很大程度提升系统的吞吐量。 一般而言&#xff0c; 缓存分为服务器端缓存&#xff0c;和客户端缓存 服务器端缓存即服务…

git权限问题解决方法Access denied fatal: Authentication failed

文章目录 遇到Access denied 的权限问题解决方法1、git的密码修改过&#xff0c;但是本地没更新。2、确定问题&#xff0c;然后增加配置① 查询用户信息②如果名称和email不对&#xff0c;设置名称&#xff1a;③ 检查ssh-add是否链接正常④ 设置不要每次都输入用户名密码 3、配…

算法通关村第3关【青铜】| 不简单的数组增删改查

1. 创建数组 //第一种创建和初始化的方法int[] arr new int[10];//第二种创建和初始化的方法int[] arr2 new int[]{0, 1, 2, 3, 5, 6, 8};System.out.println("arr2:" Arrays.toString(arr2));//第二种方式的简化版本:int[] arr3 {2, 5, 0, 4, 6, -10};System.ou…

leetcode292. Nim 游戏(博弈论 - java)

Nim 游戏 Nim 游戏题目描述博弈论 上期经典算法 Nim 游戏 难度 - 简单 原题链接 - Nim游戏 题目描述 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xff0c;轮到的人拿掉 1 -…

蓝牙资讯|中国智能家居前景广阔,蓝牙Mesh照明持续火爆

据俄罗斯卫星通讯社报道&#xff0c;中国已成为全球最大的智能家居消费国&#xff0c;占全球50%—60%的市场份额。未来&#xff0c;随着人工智能技术的发展以及智能家居生态的不断进步&#xff0c;智能家居在中国的渗透率将加速提升。德国斯塔蒂斯塔调查公司数据显示&#xff0…

已知四个坐标点,怎样求出四边形的四个内角

1&#xff0c;理论 最简单的方式利用向量进行求解 如图可得&#xff1a; cosθa*b/&#xff08;|a|*|b|&#xff09; 已知三点坐标&#xff0c;很容易可以得到两向量之积a*b&#xff0c;以及每个的模值 2&#xff0c;四个角度求解过程 首先&#xff0c;我们定义了四个坐标点…

Kubernetes+EFK构建日志分析平台

目录 Fluentd 工作原理 1.1、主机初始化配置 1.2、部署docker环境 二、部署kubernetes集群 2.1、组件介绍 2.2、配置阿里云yum源 2.3、安装kubelet kubeadm kubectl 2.4、配置init-config.yaml 2.5、安装master节点 2.6、安装node节点 2.7、安装flannel 3、部署企业…

5G之CSI报告的内容

[TOC]5G之CSI报告的内容 一、CSI包括的内容 1. UE上报的信道状态信息&#xff08;Channel State Information&#xff0c;CSI&#xff09;包括 信道质量指示&#xff08;Channel Quality Indicator, CQI)&#xff1b;预编码矩阵指示&#xff08;Precoding Matrix Indicator&…

QT:定时器事件

定时器第一种办法&#xff1a; 1.利用事件timerEvent&#xff0c;在帮助文档中找到该字段&#xff1a;[override virtual protected] void QTimer::timerEvent(QTimerEvent *e) 重写该虚函数 //重写定时器事件void timerEvent(QTimerEvent *e);2.启动定时器startTimer(1000); …

C++线程库

C线程库是C11新增的重要的技术之一&#xff0c;接下来来简单学习一下吧&#xff01; thread类常用接口 函数名功能thread()构造一个线程对象&#xff0c;没有关联任何线程函数&#xff0c;即没有启动任何线程。thread(fn, args1, args2, ...)构造一个线程对象&#xff0c;并…

Python进阶系列(一)——异常处理

异常处理 在程序中&#xff0c;如果出现异常&#xff0c;我们需要捕捉异常&#xff0c;终止程序&#xff08;可能的话&#xff09;&#xff0c;并且提示错误信息。 写好异常处理&#xff0c;对于debug有很大的好处&#xff0c;可以帮助我们捕捉到错误所在的位置&#xff0c;以…

centos 7.9 部署django项目

1、部署框架 主要组件&#xff1a;nginx、uwsgi、django项目 访问页面流程&#xff1a;nginx---》uwsgi---》django---》uwsgi---》nginx 2、部署过程 操作系统&#xff1a;centos 7.9 配置信息&#xff1a;4核4G 50G 内网 eip &#xff1a;10.241.103.216 部署过程&…

【STM32】 工程

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TO…

Maven自定义脚手架(多module模块)+自定义参数

脚手架 视频教程&#xff1a; Maven保姆级教程 脚手架是一个项目模板&#xff0c;包含常用的工程结构、代码。 1 自定义脚手架 脚手架创建的步骤如下&#xff0c;先创建一个工程&#xff0c;把常用的代码写好&#xff0c;进入工程根目录&#xff0c;进行如下操作&#xff1a; …