您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > 百科

后端队友选择Rust,爽到了!

时间:2023-03-29 11:46:00  来源:51CTO  作者:王瑞平

作者 | Andrew Israel

编译 | 王瑞平

Rust作为长期以来被看好的网络开发语言,更注重技术的稳定性,不掉链子,能够将设备的性能发挥到极致,更讲究精致。

相对于其它类型的语言来讲,Rust是新成员。最早由Mozilla于2014年4月9日发布,是一款高级通用语言,能够兼顾开发与执行效率。

虽然Rust并不是一个专属的网络应用开发语言,但是非常适合网络开发。编译器能就安全稳定方面的问题作出提醒。这使其具备了后端网络开发的独特优势。

我曾在《用Rust创建一家初创公司》一书中提到:“初创公司应优先考虑开发人员所带来的生产力而并非其能力。”对于一家创业公司创始人来讲,这种观点是明智的。也正因为如此,我喜欢使用Rust,并雇佣了同样喜欢使用Rust的开发人员。

我必须提醒:如果你的团队中没有其他人会使用Rust,那么,教授所有同事使用Rust的成本将会很高。他们可能需要一段时间才能游刃有余地使用Rust,在此期间,你需要指导他们,工作效率会因此下降。明智的选择是使用团队其他人都知道的语言,除非你真正需要使用Rust。

 

图片

 

幸运的是,我的队友已经了解并喜欢上了使用Rust,并熟知如何让代码生成工具(如,Serde和Diesel)最大效能地发挥作用,以成为更好的Rust程序员

1、用Rust语言建立数据泄露防护系统

我的团队为Cloudflare建立了数据泄露防护系统。该系统通过对网络流量进行“扫描”确保私人数据没有被泄露。例如,它可以检测并阻止黑客从你的数据库中上传数百万个信用卡号码到pastebin.org,或者阻止某人将带有特定office标签的word文档发送到你的yahoo.com电子邮件。

实际上,我们可以将扫描网站以防止数据丢失的服务想象为数据泄露防护系统扫描仪。在此过程中,系统可能同时代理很多http请求,对性能敏感。

我们不希望用户在打开数据泄露防护系统时,网页浏览速度变慢,并因此提供了两种构建后端API可供选择的语言:Rust和Go。

无论使用哪种语言,构建出的后端API必须能够与数据泄露防护系统进行互操作,并能够共享一系列类型,如:表达用户配置等。API服务器将用户配置序列化为JSON,数据泄露防护系统将在需要扫描请求时反序列化该JSON。

在实际操作过程中,我更倾向于用Rust语言编写所有序列化和反序列化程序。此外,我个人比较倾向于在系统的不同部分之间共享代码,针对性能关键型服务和非性能敏感型服务使用Rust可以大大简化整个代码库。

2、用Rust构建数据库

虽然Rust在构建数据库方面并不出色,但我还是认为它在此方面性能优良。

就拿Rust语言中的Diesel框架来说,它能够从SQL数据库语言之中迁移生成类型化SQL模式,从而生成所有SQL查询。此外,当更新SQL模式时,Diesel将重新生成适当的Rust模型。

实际上,在Rust类型系统中构建SQL模型会导致一系列问题,包括:错误消息超过60行、毫无意义的错误信息、很难将公共代码分解为共享函数等。

但总的来说,如果你的应用程序在很大程度上依赖于数据库的许多功能,我认为有必要确保你的数据库查询获得了正确的检查类型。

数据库查询不是API后端中可选的额外内容,它们几乎是你的整个代码库。所以确保它们正确是值得的。

3、用Rust进行业务建模

运用Rust语言中的Diesel和Serde框架,你可以在API中生成几乎所有重要的代码(读取请求、执行数据库查询和编写响应),从而使你有更多的时间来编写业务程序、发布特性并进行业务建模。

重要的是,存储用户配置的后端API能够在软件中正确地模拟现实世界。如果用户想在软件中模拟办公室布局,类型系统就能够直接对办公室建模,而不必让用户推送无效配置。

用户往往希望在编译时而不是在运行时检测到无效的配置,从而尽量减少测试和错误代码。例如,用户的办公室不可能同时位于两个时区。那么,你的软件模型就不应该能够表示具有两个时区的办公室。

对了,Rust有两个特性可以帮助你准确地进行业务建模:枚举和不可克隆类型。

重点说下Rust的枚举特性。它还可以被称为“和类型”、“标记联合”、“代数数据类型”或“带有关联值的枚举”。这取决于你使用的语言。我个人比较喜欢求和类型,iphone开发者可以在Swift中使用。

准确地进行业务建模是我在构建高级API中非常关心的事情,正确性至关重要。如果需要确保我的软件模型准确表现出现实世界,Rust比Go更好用。

现在谈谈Rust的“不可克隆类型”特性。在实际操作过程中,如果其中一个IP是“不健康”的,并断开了Cloudflare连接,那么,Cloudflare需要避免重复使用这些IP,并使用一些以前没有用过的IP。

应确保每个IP都有三种状态:正在使用、未使用和以前使用过但现在“不健康”。这些IP中的每一个都可以分配给四个长时间TCP连接中的一个。

这听起来像是一个很容易解决的问题,但在实际操作过程中很难对“每个IP地址最多只能分配给一个连接”的想法进行建模。我必须编写大量单元测试程序,以找到两个不同的连接获取相同IP地址的边缘情况。

Rust可以很容易地确保特定值只在一个地方使用。这需要确保使用该值的函数都必须引用它,或者确保你的类型没有被强制Clone,并保证使用它的函数拥有该值的全部所有权。这样,该值将能够在移动时移动到函数中,函数可以在完成时返回该值。

所以,如果我想在Rust中实现上述操作系统,只需要保留我的10个IP地址的HashSet,也要确保IP没有派生克隆出新类型。因此,Rust的“不可克隆类型”特性至关重要。

4、Rust的可靠性

对于你的初创公司来说,系统的可靠性很重要。我们提供的Rust后端服务的优点是它从不崩溃。在实践中,Rust通常有更好的方法处理不同的选项。

而这种可靠性肯定会带来开发人员的额外开销,比如,考虑如何正确地匹配所有的Result和Option值。但对于许多领域来说,这种付出是有意义的。

值得注意的是,Rust不倾向于使用太多内存(如TCP连接或文件描述符)。因为当函数终止时,所有内容都会被删除和清理。

在实际应用过程中,性能问题最终会变成可靠性问题。如果你的服务泄漏内存的时间足够长,或者摄入了足够多的数据,那么性能存在的瓶颈可能会导致服务器宕机。

 

图片

 

5、是否应该选择Rust

Rust作为高级系统编程语言做出了令人满意的成绩。当你在网络开发时,它可以通过Serde和Diesel节省开发者时间。神奇的是,虽然类型系统简化了业务建模过程,但是服务质量却不会因此下降。

对于Rust语言的使用效果评价并不是绝对的,需要根据不用的情况进行判断。如果你的团队没有过多的Rust使用经验,在网络开发时使用Rust可能会带来非常糟糕的结果。Rust的使用难度极高,你应该根据具体情况引导团队使用熟知的语言。

公司会根据不同的情况使用不同的语言。在Cloudflare, 我们执行大多数对性能敏感的服务过程中使用Rust,执行对性能宽松的服务(如,API后端)过程中则使用Go。我公司的团队过去使用Go语言进行后端开发,由于上文提到的原因逐渐迁移至Rust语言。

对于使用Rust语言的不同权衡并非对每个团队都有意义。这主要是由于学习Rust和在Rust中重写核心业务库需要耗费巨大成本。即便如此,仍有越来越多团队愿意考虑使用Rust作为其在后端开发过程中使用的语言。

总之,不同公司应该根据自身的情况使用熟知的语言完成工作。如果你的团队已经熟知Rust,那么,在完成高级项目过程中使用它绝对是明智的。

参考链接:​​https://blog.adamchalmers.com/why-rust-on-backend/​



Tags:Rust   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
聊聊Rust里面的数据类型
嘿,朋友们!今天我们来聊聊Rust里面的数据类型。你知道吗?Rust的数据类型可是很重要的哦,它们帮助我们定义变量和函数可以处理什么样的数据。基本数据类型首先,让我们来看看Rust提...【详细内容】
2024-04-11  Search: Rust  点击:(2)  评论:(0)  加入收藏
Rust 标准库 1.77.2 发布,修复高危漏洞
IT之家 4 月 10 日消息,Rust 的优势之一就是安全,但这并不代表该编程语言就没有漏洞。安全专家近日发现了追踪编号为 CVE-2024-24576 的漏洞,攻击者利用 Rust 标准库中的一个安...【详细内容】
2024-04-10  Search: Rust  点击:(4)  评论:(0)  加入收藏
在Rust中使用Serde的详细指南
在处理HTTP请求时,我们总是需要在一种数据结构(可以是enum、struct等)和一种可以存储或传输并稍后重建的格式(例如JSON)之间来回转换。Serde是一个库(crate),用于高效、通用地...【详细内容】
2024-03-26  Search: Rust  点击:(17)  评论:(0)  加入收藏
Rust 写脚手架,Clap你应该知道的二三事
有感而发最近,在和前端小伙伴聊天发现,在2024年,她们都有打算入局Rust学习的行列。毕竟前端现在太卷了,框架算是走到「穷途末路」了,无非就是在原有基础上修修补补。所有他们想在...【详细内容】
2024-03-11  Search: Rust  点击:(20)  评论:(0)  加入收藏
前端开始“锈化”?Vue团队开源JS打包工具:基于Rust、速度极快、尤雨溪主导
Vue 团队已正式开源Rolldown —— 基于 Rust 的 JavaScrip 打包工具。Rolldown 是使用 Rust 开发的 Rollup 替代品,它提供与 Rollup 兼容的应用程序接口和插件接口...【详细内容】
2024-03-09  Search: Rust  点击:(11)  评论:(0)  加入收藏
Rust中的数据可视化指南
可视化是数据分析和解释的一个关键方面。虽然Rust主要以其性能和安全特性而闻名,但它也为数据可视化提供了强大的工具。在这个全面的指南中,我们将深入研究Rust中的数据可视化...【详细内容】
2024-03-07  Search: Rust  点击:(31)  评论:(0)  加入收藏
如何在Rust中操作JSON,你学会了吗?
sonic-rs ​还具有一些额外的方法来进行惰性评估和提高速度。例如,如果我们想要一个 JSON​ 字符串文字,我们可以在反序列化时使用 LazyValue​ 类型将其转换为一个仍然带有斜...【详细内容】
2024-02-27  Search: Rust  点击:(47)  评论:(0)  加入收藏
记一次Rust内存泄漏排查之旅
在某次持续压测过程中,我们发现 GreptimeDB 的 Frontend 节点内存即使在请求量平稳的阶段也在持续上涨,直至被 OOM kill。我们判断 Frontend 应该是有内存泄漏了,于是开启了排...【详细内容】
2024-02-27  Search: Rust  点击:(12)  评论:(0)  加入收藏
Rust 最受欢迎的这些库
今天分享主题是,关于一些值得注意的 Rust 库,这些库可以根据它们的功能和在编码中的受欢迎程度进行选择。什么是 Rust 库?在 Rust 中,常被称为 “crate” 的库,是一个打包的单元...【详细内容】
2024-02-19  Search: Rust  点击:(50)  评论:(0)  加入收藏
异步Rust:构建实时消息代理服务器
在本文中,我们将深入研究使用Rust构建实时消息代理服务器,展示其强大的并发特性。我们将使用Warp作为web服务器,并使用Tokio来管理异步任务。此外,我们将创建一个WebSocket客户...【详细内容】
2024-02-01  Search: Rust  点击:(58)  评论:(0)  加入收藏
▌简易百科推荐
用于人工智能开发的主流编程语言都有哪些?
在人工智能开发领域,编程语言的选择至关重要。目前,主流的编程语言主要包括Python、Java、C++、JavaScript和Swift等。这些语言各具特色,适用于不同的人工智能开发场景。首先,Py...【详细内容】
2024-01-31    简易百科  Tags:编程语言   点击:(132)  评论:(0)  加入收藏
探究微处理器开发中的汇编语言的优势与挑战
在计算机编程中,汇编语言是一种低级语言,它可以直接控制计算机的硬件资源。与高级语言相比,汇编语言具有更高的运行效率和更好的控制能力,但同时也更加复杂和难以理解和维护。在...【详细内容】
2023-12-19  松鼠宝贝    Tags:汇编语言   点击:(99)  评论:(0)  加入收藏
选择适合微服务的编程语言,让你的工作事半功倍!
讨论编程语言就像是一场政治辩论。每个开发者都会过分捍卫他/她所使用的编程语言。然而,编程语言应该被看作是它们真正是的东西,即一种工作工具。每种编程语言都有特定的目的...【详细内容】
2023-12-14  爱发白日梦的后端  微信公众号  Tags:编程语言   点击:(178)  评论:(0)  加入收藏
编程语言大比拼:Python、Java、C、C++、Go 实现 'Hello World' 和九九乘法表"
应该90%的IT专业的朋友写的第一段代码就是打印"holle world",每个大学老师都会通过这个方式吸引你对课程产生兴趣。也许有的朋友学的是JAVA开发,有的学的是c,在几年前应该很...【详细内容】
2023-12-11  IT仔的笔记本  微信公众号  Tags:编程语言   点击:(216)  评论:(0)  加入收藏
TypeScript中的null和undefined的区别
在TypeScript中,null和undefined是两个特殊的值,用于表示变量的缺失或未定义。尽管它们在某些情况下可能看起来相似,并且都可以表示"没有值",但它们在语义和用法上存在一些重要...【详细内容】
2023-12-07  科学随想录  微信公众号  Tags:TypeScript   点击:(135)  评论:(0)  加入收藏
面向AI开发的六种最重要的编程语言
作者丨FATIH KÜÇÜKKARAKURT 译者 | 布加迪审校 | 重楼出品 | 51CTO技术栈(微信号:blog51cto)在AI开发界,你使用的编程语言很重要。每种语言有其独特...【详细内容】
2023-12-07    51CTO  Tags:编程语言   点击:(121)  评论:(0)  加入收藏
NLP问题实战:基于LSTM(RNN)和Transformer模型
译者 | 朱先忠审校 | 重楼简介GPT等语言模型最近变得非常流行,并被应用于各种文本生成任务,例如在ChatGPT或其他会话人工智能系统中。通常,这些语言模型规模巨大,经常使用超过数...【详细内容】
2023-11-29    51CTO  Tags:NLP   点击:(273)  评论:(0)  加入收藏
一文了解低级和高级编程语言
中文是一种尽量用简短文字表达更多含义的语言,所以很多时候一句话的含义很容易曲解成别的意思。最近,有人提出C语言是一种中级语言的概念,所以特意介绍一下低级语言和高级语言...【详细内容】
2023-11-23  数字随行  微信公众号  Tags:编程语言   点击:(232)  评论:(0)  加入收藏
JetBrains 发布 2023 调研报告:77% 开发者使用 ChatGPT
IT之家 11 月 21 日消息,JetBrains 日前公布了《2023 开发人员生态系统现状》调研报告,汇集了来自全球 26,348 位开发者的调研结果。《开发者生态系统现状报告》涵盖广泛的主...【详细内容】
2023-11-21    IT之家  Tags:JetBrains   点击:(238)  评论:(0)  加入收藏
Go vs Rust:文件上传性能比较
一、设置所有测试都在配备16G内存的 MacBook Pro M1 上执行。软件版本为: Go v1.20.5 Rust v1.70.0测试工具是一个基于 libcurl 并使用标准线程的自定义工具,能够发送多部分请...【详细内容】
2023-11-20  技术的游戏  微信公众号  Tags:Rust   点击:(174)  评论:(0)  加入收藏
站内最新
站内热门
站内头条