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构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动
相关文章:

Web和云开发,Rust会起飞?
Web和云开发,Rust会起飞? 一、前言 二、大厂偏爱,Rust的未来 三、Rust做Web的雄心 四、有必要换Rust做Web? 1.效率和性能 2.可靠性和可维护性 五、Rust先苦后甜 六、用Rust前的几个问题 七、开发界的强者 一、前言 去年…...

深度学习项目学习
文章目录 torchvisiontorchvision.transforms.Compose()类 DataLoader类torch.nntorch.nn.Moudletorch.nn.Sequential模型容器nn.CrossEntropyLoss()交叉熵损失函数 numpynumpy.random. shuffle(x) torchvision torchvision和pytorch的关系: torchvision是PyTorch的…...

【3Ds Max】弯曲命令的简单使用
简介 在3ds Max中,"弯曲"(Bend)是一种用于在平面或曲面上创建弯曲效果的建模命令。使用弯曲命令,您可以将对象沿特定轴向弯曲,从而创建出各种弯曲的几何形状。以下是使用3ds Max中的弯曲命令的基本步骤&…...

opencv基础:几个常用窗口方法
开始说了一些opencv中的一些常用方法。 namedWindow方法 在OpenCV中,namedWindow函数用于创建一个窗口,并给它指定一个名字。这个函数的基本语法如下: import cv2cv2.namedWindow(窗口名称, 标识 )窗口名称:其实窗口名称&…...

web后端解决跨域问题
目录 什么是跨域问题 为什么限制访问 解决 什么是跨域问题 域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。但是一般情况下不能这么做,它是由浏览器的同源策略造成的,是浏览器对js施加的安全…...

06 json数据解析和列表控件
内容回顾 json数据解析 json ----- 对要传输的数据进行封装的工具 json是由json数组([]) 和 json对象({})在qt中,对JSON数据进行处理(解析和打包) JSON数据处理所要包含的类: QJsonDocument -----它的作用是将数据转换成json文档 QJsonArray ---- json数组,就是封装多个…...

分布式 - 消息队列Kafka:Kafka生产者架构和配置参数
文章目录 1. kafka 生产者发送消息整体架构2. Kafka 生产者重要参数配置01. acks02. 消息传递时间03. linger.ms04. buffer.memory05. batch.size06. max.in.flight.requests.per.connection07. compression.type08. max.request.size09. receive.buffer.bytes和 send.buffer.b…...

MAUI+Blazor:windows 打包踩坑
文章目录 前言MSIX安装文件如何发布选择Windows平台旁加载自定义签名版本号安装 总结 前言 最近打算研究一下MAUIBlazor,争取在今年年底之前彻底搞懂MAUIBlazor的安装模式, MSIX安装文件 Windows 4种安装程序格式MSI,EXE、AppX和MSIX优缺点…...

web集群学习:搭建 LNMP应用环境
目录 LNMP的介绍: LNMP组合工作流程: FastCGI介绍: 1、什么是 CGI 2、什么是 FastCGI 配置LNMP 1、部署LNMP环境 2、配置LNMP环境 LNMP的介绍: 随着 Nginx Web 服务的逐渐流行,又岀现了新的 Web 服务环境组合—…...

我的创作纪念日(256天)
前言 结缘 我与csdn的结缘,之前在创作纪念日(128天)便已提到,今在此便不再多言 收获 很惭愧,自六月底至八月中旬,因为忙于找工作,奔赴面试求职之际,写博客没有像之前那么勤&#x…...

Vue 转 React 指南
原文: https://icheng.github.io/2023/08/10/Vue%E8%BD%ACReact%E6%8C%87%E5%8D%97/ JSX 先介绍 React 唯一的一个语法糖:JSX。 理解 JSX 语法并不困难,简单记住一句话,遇到 {} 符号内部解析为 JS 代码,遇到成对的 …...

Oracle外部表ORACLE_LOADER方式加载数据
当数据源为文本或其它csv文件时,oracle可通过使用外部表加载数据方式,不需要导入可直接查询文件内的数据。 1、如下有一个文件名为:test1.txt 的数据文件。数据文件内容为: 2、使用sys授权hr用户可读写 DATA_PUMP_DIR 目录权限&a…...

【RocketMQ】NameServer总结
NameServer是一个注册中心,提供服务注册和服务发现的功能。NameServer可以集群部署,集群中每个节点都是对等的关系(没有像ZooKeeper那样在集群中选举出一个Master节点),节点之间互不通信。 服务注册 Broker启动的时候会…...

Wordcloud | 风中有朵雨做的‘词云‘哦!~
1写在前面 今天可算把key搞好了,不得不说🏥里手握生杀大权的人,都在自己的能力范围内尽可能的难为你。😂 我等小大夫也是很无奈,毕竟奔波霸、霸波奔是要去抓唐僧的。 🤐 好吧,今天是词云&#x…...

《孤注一掷》现实版:29万打水漂,华为程序员也躲不过的诈骗
明天周五,约吗? 不管怎样,反正播妞已经订好了《孤注一掷》的电影票。不为别的,《孤注一掷》太敢拍了!!! 美女荷官在线发牌,高知程序员在线养“猪”,诈骗头目“虔诚”拜…...

C语言库函数之 qsort 讲解、使用及模拟实现
引入 我们在学习排序的时候,第一个接触到的应该都是冒泡排序,我们先来复习一下冒泡排序的代码,来作为一个铺垫和引入。 代码如下: #include<stdio.h>void bubble_sort(int *arr, int sz) {int i 0;for (i 0; i < sz…...

Maven之mirrorof范围
mirrorOf 是 central 还是 * 的问题 在配置阿里对官方中央仓库的镜像服务器时,我们使用到了 <mirror> 元素。 <mirror><id>aliyunmaven</id><mirrorOf>central</mirrorOf><name>阿里云公共仓库</name><url>…...

游戏中的UI适配
引用参考:感谢GPT UI适配原理以及常用方案 游戏UI适配是确保游戏界面在不同设备上以不同的分辨率、屏幕比例和方向下正常显示的关键任务。下面是一些常见的游戏UI适配方案: 1.分辨率无关像素(Resolution-Independent Pixels)&a…...

【Linux命令详解 | gzip命令】 gzip命令用于压缩文件,可以显著减小文件大小
文章标题 简介一,参数列表二,使用介绍1. 基本压缩和解压2. 压缩目录3. 查看压缩文件内容4. 测试压缩文件的完整性5. 强制压缩6. 压缩级别7. 与其他命令结合使用8. 压缩多个文件9. 自动删除原文件 总结 简介 在Linux中,gzip命令是一款强大的文…...

IP 协议的相关特性和数据链路层相关知识总结
目录 IP 协议的相关特性 一、IP协议的特性 二、 IP协议数据报格式 三、 IP协议的主要功能 1. 地址管理 动态分配 IP地址 NAT机制 NAT背景下的通信 IPV6 2. 路由控制 3.IP报文的分片与重组 数据链路层相关知识 1、以太网协议(Ethernet) 2.M…...

探索C语言中的常见排序算法
探索C语言中的常见排序算法 排序算法是计算机科学中至关重要的基础知识之一,它们能够帮助我们对数据进行有序排列,从而更高效地进行搜索、插入和删除操作。在本篇博客中,我们将深入探讨C语言中的一些常见排序算法,包括它们的工作…...

【UE】Web Browser内嵌网页在场景中的褪色问题
使用WebBrowser放置在场景中时,网页颜色会出现异常的褪色。 这是因为 Web 浏览器插件以 sRGB 格式输出其颜色数据,而 Widget/3D Widget 需要线性 RGB 格式的数据。 可以通过创建在 3D Widget 中使用的新材质(而不是默认的 Widget3DPassthr…...

rust入门系列之Rust介绍及开发环境搭建
Rust教程 Rust基本介绍 网站: https://www.rust-lang.org/ rust是什么 开发rust语言的初衷是: 在软件发展速度跟不上硬件发展速度,无法在语言层面充分的利用硬件多核cpu不断提升的性能和 在系统界别软件开发上,C出生比较早,内…...

embed mongodb 集成spring
在property文件下添加 de.flapdoodle.mongodb.embedded.version5.0.5 spring.mongodb.embedded.storage.oplog-size0不指定数据库,会使用test, port默认是0,随机端口号。 oplog-size mac默认是192mb, 其他系统会使用5%的磁盘可用空间&#x…...

ssh远程连接服务器
一、远程连接服务器简介 二、连接加密技术简介 三、ssh服务配置 四、用户登录ssh服务 Enforcing会强制限制,如端口为22,可以访问,如果是2000端口,不能使用 Permissive是宽容的模式,不限制使用端口 Enforcing会重启失败…...
性能分析之MySQL慢查询日志分析(慢查询日志)
一、背景 MySQL的慢查询日志是MySQL提供的一种日志记录,他用来记录在MySQL中响应的时间超过阈值的语句,具体指运行时间超过long_query_time(默认是10秒)值的SQL,会被记录到慢查询日志中。 慢查询日志一般用于性能分析时开启,收集慢SQL然后通过explain进行全面分析,一…...

每日一练 | mongo集群如何创建分片键
文章目录 MongoDB是什么什么是分片键环境如何设置分片键 MongoDB是什么 MongoDB 是一个基于分布式文件存储的数据库 什么是分片键 分片:每个分片包含分片数据的一部分。每个分片可以部署为副本集。 而分片键的作用就是把数据按一定的条件分布到各个分片中&#…...

Postman
Postman 简介下载安装 简介 Postman 是一款用于测试和开发 API(应用程序编程接口)的工具,它提供了用户友好的界面和丰富的功能,帮助开发者轻松地创建、测试、调试和文档化各种类型的 API。无论是在构建 Web 应用、移动应用还是其…...

chapter 3 Free electrons in solid - 3.1 自由电子模型
3.1 自由电子模型 Free electron model 研究晶体中的电子: 自由电子理论:不考虑离子实能带理论:考虑离子实(周期性势场)的作用 3.1.1 德鲁德模型 Drude Model - Classical Free Electron Model (1)德鲁德模型 德鲁…...

搭建博客时前端美化内容CSS推荐
一、背景 在搭建博客的时候,发现对其markdown文章内容进行渲染的时候,样式调整比较花费时间 二、解决思路 自己适配样式 缺点:ROI不高 使用开源的markdown的样式:github-markdown-css 三、实现教程 1、NPM安装 npm install …...