Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230

Deprecated: Invalid characters passed for attempted conversion, these have been ignored in /www/wwwroot/www.85520057.com/func.php on line 230
Loading

Rust不适合开发Web API

2021-02-09 21:31:02 2263

卓(zhuó)英软件
作(zuò)者 | Tom MacWright
译者 | 吴留坡
策(cè)划(huá) | 蔡芳芳
来源丨前端(duān)之巅(diān)(ID:frontshow)

Rust 是一门神奇的(de)编程(chéng)语(yǔ)言,有非常好的 CLI 工具,比如(rú) ripgrep 和 exa。像 Cloudflare 这样的公司正(zhèng)在使用(yòng)并 鼓励(lì)人们(men)写 Rust 来运行微服(fú)务。Rust 编写(xiě)的软件可能比 C++ 或(huò) C 更安全、更(gèng)小、更简洁。

如果(guǒ)我正在编写一个地理编码器、一个路(lù)由引擎、一个实(shí)时消息平台、一个数据(jù)库或(huò)一个 CLI 工具(jù),Rust 最合适。

但去年,我试图用(yòng) Rust 写(xiě)一个(gè)传(chuán)统网(wǎng)站(zhàn)的(de)纯(chún) API 服务,Rust 就不合适了。

缺失很(hěn)多小功能(néng)

Rust 有大(dà)量的 Web 服务框(kuàng)架、数据库连接(jiē)器和解析器。但搭建身份验证服务方面(miàn)只有非常低层次的组件。Node.js 有 passport.js,Rails 有 devise,Django 有 开(kāi)箱即用的身份验(yàn)证模型,在 Rust 中,你(nǐ)需(xū)要学习如何将共享 Vec 转换到底层(céng)加(jiā)密库才(cái)能(néng)构建这个系统。

译者(zhě)注,Vec 是一个动态数组,只会自动增长而(ér)不会(huì)自动收缩(suō)。区别于(yú) Array,Vec 具有动态的添(tiān)加和删除(chú)元素的能力,并(bìng)且能够以(yǐ) O(1) 的效率进(jìn)行随机访问(wèn)。Vec 的(de)所有内容(róng)项都是生成在(zài)堆空间上的,可以轻易的将 Vec 移出一个栈而不用担心内存拷贝影响执行效率,毕竟(jìng)只是拷贝栈(zhàn)上(shàng)的指针。

有些(xiē)库(kù)试图解(jiě)决这个问题,比如 libreauth,但它才刚刚开始开发。还(hái)有很多类似的 Web 框架问题。

SDK 呢?在主流编程(chéng)语言中,你可以通过一个(gè)官方库来接(jiē)入(rù) Google 云服务、AWS 或 Stripe。这些官(guān)方(fāng)库大(dà)都很棒。例如,aws-sdk-js 和(hé) Stripe 库(kù)的设计(jì)和维(wéi)护得非常(cháng)好。

Rust 就不这样,只(zhī)有少(shǎo)许第三方库,但以(yǐ)这些(xiē)服务的开发速(sù)度,它们真的能够(gòu)提供高质量的体验吗?

有人会说好吧,X 编(biān)程(chéng)语言太好了,你可以在(zài)周末自己(jǐ)写一个(gè) SDK!我(wǒ)必须回答(dá),不。

Rust 的生(shēng)态系(xì)统在其它领域非(fēi)常丰(fēng)富。用于构建(jiàn) CLI、管理并发(fā)性、使用二(èr)进制数据和底层解析器的 crates 令(lìng)人(rén)印象深刻,非常棒。

Rust 编译器比(bǐ)以前快,但仍(réng)然很慢(màn)

我一直在看 Nicholas Nethercote 的博客,描述了 Rust 团队如何优化编译(yì)器(qì),让它更快!

但与(yǔ)其它编程语(yǔ)言(yán)相比,用它构建网站会很(hěn)慢。它比编译型编(biān)程语言 Go 慢得(dé)多,也比解释型编程语(yǔ)言 JavaScript、Ruby 和 Python 等慢得多。

一旦(dàn)代码被编译,一切(qiē)就变得非常棒了!但在(zài)我的(de)情况下,甚至(zhì)基本 API 功(gōng)能都不完整,一个(gè)不(bú)复杂的系统——居然花了 10 多分钟来编译。Google 代码(mǎ)构建 的硬件配置很差(chà),每次都会超时,我(wǒ)啥都编译不(bú)了。

只要(yào)不重建缓(huǎn)存(cún)依赖项,缓存(cún)就有意义。也许 减(jiǎn)少(shǎo)依赖 会加快(kuài) Rust 项目编译。但就像 serde,几乎所有人(rén)都使用的 JSON 和(hé)其它(tā)序列化(huà) / 反序列(liè)化(huà)程序占用(yòng)了大量的编译时间。我们是否应该(gāi)用编译速度更快但缺乏(fá)大量文(wén)档和生态(tài)系统支持的东西来取代 serde?这种取舍非常糟糕(gāo)。

Rust 很复(fù)杂

Rust 让你从代码维(wéi)度进行思考(kǎo),这对系统编程来(lái)说(shuō)非常重要(yào)。它让你思(sī)考(kǎo)如何共享(xiǎng)或复制内(nèi)存,思考(kǎo)真实但(dàn)不太可能的小(xiǎo)概率(lǜ)事(shì)件,并确保妥善处理它(tā)们,帮你编写(xiě)各种(zhǒng)各样(yàng)的高效代码。

这些担忧都是合理的,但是对于大多数 Web 应用程序来说,它们并(bìng)不是最重要的关注点,以流行的惯性思考会导(dǎo)致不正确的假设。

就拿 Rust 的安全性来(lái)说吧。这是它宣传(chuán)语中(zhōng)的重要部分,这是绝对正确的:Rust 的承诺安全和底层两者兼而有之——它可(kě)以(yǐ)在没有垃(lā)圾(jī)收集器的情况下工作,同(tóng)时防止基于内(nèi)存的漏洞。当你(nǐ)读到“安全(quán)”的时(shí)候,想想 Rust 的竞(jìng)争对(duì)手 C 吧。C 语言中的代码可(kě)以引用任意内存,很容易溢出和(hé)出错。Rust 代码可以和 C 代码一样快(kuài),但是可(kě)以保护内存访问,而不需(xū)要(yào)垃圾收(shōu)集器或某种运行时检查(chá)。

但(dàn)是 Rust 的内(nèi)存规则并不比 Node.js 或 Python 更安全,用 Rust 编写(xiě)的 Web 应用程序在(zài)系统上(shàng)不会比 Python 或 Ruby 应用程序(xù)安全。带有垃圾收(shōu)集器(qì)的高级编程(chéng)语言(yán)通常为避免这类(lèi)漏洞利用和错误而(ér)付出性(xìng)能损(sǔn)失(shī)。不能在 JavaScript 中引用(yòng)未(wèi)初始化的内存,因(yīn)为 JavaScript 中不进行内存间的引用。

旁(páng)注:这是在描述 Node.js 和(hé)其(qí)它系(xì)统的设计目标——它(tā)们确实偶尔会有 bug。Node.js 的(de)缓存对象,就值(zhí)得读一(yī)读。

你要(yào)是 问一(yī)些人,他们会说如果(guǒ)使用(yòng)不(bú)安全的代码(mǎ),Rust 相比带有内存回(huí)收的编程语言是(shì)不安(ān)全的(de)——包括最流行(háng)的(de) Web 框架 Actix(译者注,Actix 是 Rust 的 Actor 异(yì)步并发框架,基(jī)于 Tokio 和 Future,开箱具有(yǒu)异步非(fēi)阻塞事件驱动并发能力,其实现低层级 Actor 模型(xíng)来提(tí)供(gòng)无(wú)锁(suǒ)并(bìng)发(fā)模型,而且同(tóng)时提供同(tóng)步 Actor,具有(yǒu)快(kuài)速、可靠,易可扩展 https://actix.rs/),因为 不安全(quán)代码允许原(yuán)始(shǐ)指针的延迟(chí)。

如果你正在写一个视(shì)频(pín)游戏(xì),暂停执行垃圾收集是不(bú)好(hǎo)的。如果你在编写微控制器代码(mǎ),任何内存“开销”或浪费都(dōu)是非(fēi)常糟糕(gāo)的(de)。但是大多数 Web 应用程序可以节省一(yī)点内存开销来换取生产性能(néng)。

Rust 的其它属性(xìng)面对的(de)争议几乎(hū)一样。它的并(bìng)发特性是太神奇了,如(rú)果(guǒ)你在做一些复(fù)杂的事情,需要快速响应,这当然很(hěn)棒。但如果情(qíng)况不是这样呢?至少可以说,Rust 的异步(bù)生(shēng)态系统面(miàn)临着很大(dà)挑战:各(gè)种不相关的(de)领域中有(yǒu)着不同的异步实现(xiàn),比如 tokio。

相比较之下,Python 的(de) Tornado 和 Twisted 异步实现(xiàn)的很奇怪,Node.js 异(yì)步实(shí)现(xiàn)的很好(hǎo),但(dàn)语法都很(hěn)丑陋。

我确信,Rust 的异(yì)步(bù)将会稳定和(hé)统一,未来会更容易操作,但(dàn)我现在就要用啊。

Rust 生态系统(tǒng)不是以 Web 为中心(xīn)的

很多人正在学 Rust,用 Rust 编写(xiě) CLI 应用(yòng)程序或底层代(dài)码,并且玩(wán)得非常开心(xīn)。使用(yòng) Rust 编写普通(tōng) Web 应(yīng)用程(chéng)序的人(rén)明显少很多。

这(zhè)是技(jì)术选择中的重要部分:是否(fǒu)有人在使(shǐ)用(yòng)该工具?他们大致在同一个领域吗?不幸的是(shì),Rust 生(shēng)态系统中许多令人难以置(zhì)信(xìn)的令人兴奋的工(gōng)作与(yǔ) Web 应(yīng)用服务器无关。的(de)确(què)存在一些很(hěn)有前(qián)途的 Web 框架——甚(shèn)至更高层次的(de)框(kuàng)架(jià),但毫无疑问,它们市场很小。即使是主要(yào)的 Web 框架 Actix 也(yě)只有几(jǐ)个顶尖贡献者。

如果 Rust 以目前的(de)速度增长,那么社(shè)区中的(de) Web 部分将达到(dào)一(yī)个临界值,但我认(rèn)为没有足够多的人使用 Rust 作为网站的实用工(gōng)具。与其它(tā)社区相比,有(yǒu)很(hěn)多公司致力(lì)于使用(yòng)现有(yǒu)的工具来构建 Web 应用(yòng)程序,这(zhè)些工具不是最前沿的,但足够将(jiāng)成熟技术与新(xīn)技术区分开来。

Juniper 的 N+1 次查询

这(zhè)一部分不仅仅是 Rust,它还涉及 GraphQL 生(shēng)态系统,Rust 参与(yǔ)这个生态(tài)系统就是一个例子。

N+1 问题 是每个(gè)构建(jiàn) Web 应(yīng)用程(chéng)序的人都应该知道的(de)。要点是:你有(yǒu)一页照片(一次查(chá)询),你要显(xiǎn)示每张照片的作者,会有多少次查询:1,合并照片和(hé)作者,或者在(zài)检索照片后对每张照片进行查询以获取作(zuò)者?或者两次,第二次查询 ids 中的 user.id,一次(cì)获取(qǔ)所有作者,然后重新设置他们的照片属性。

N+1 查(chá)询通常优先使用(yòng)数据库解决:比如(rú)将 N+1 查询改为单个查询(xún),会带来明(míng)显的性(xìng)能优化。我(wǒ)们有很多方法来尝(cháng)试和解决这些问题(tí):你可(kě)以编写 SQL,并尝试使用(yòng) CTE 和 JOIN 在单个查询中(zhōng)完(wán)成大(dà)量工作,就(jiù)像我们在 Observable 中所做(zuò)的(de)那样,或者使用(yòng)像 ActiveRecord 这样的 ORM 层将 N+1 查(chá)询转换为可预(yù)测查(chá)询的快速方法。

Juniper 是一(yī)个用(yòng)于 Rust 应用程序(xù)的 GraphQL 服务。GraphQL 基本上都是由前端应(yīng)用(yòng)程序定(dìng)义查询,而不是后端。给它一系列可以(yǐ)查(chá)询(xún)的(de)东(dōng)西,然(rán)后(hòu)应用程序(React 或其(qí)它)将任意(yì)查询发送到后端。

这会让后端变得复杂(zá)。任何 SQL 级别的优化都不可能做到——你的服务器正在编写动态 SQL,优化只能依赖 GraphQL 服务,但它不会(huì)总是有(yǒu)效(xiào)。例如(rú):Juniper 默(mò)认情况下执行的是 N+1 查询,解(jiě)决方案 dataloader 还比(bǐ)较(jiào)粗糙(cāo)且需要单独维护。因此,最(zuì)终您将拥(yōng)有一个非常快的应用程序层(céng),但(dàn)它所有的时间(jiān)都花在了极其低(dī)效的数据库(kù)查询上。

总之,GraphQL 与 NoSQL 数(shù)据库配(pèi)合(hé)使用效果非常好,它可以(yǐ)快速为(wéi)这些类型的(de)请(qǐng)求提供服务。我确信 Facebook 内部有(yǒu)一些特定的数据库与(yǔ) GraphQL 结(jié)合(hé)在(zài)一起使用效果非常棒,但业内其他企业则(zé)非常(cháng)依赖 Postgres 和同类产品。

一些注意事项

首先,本(běn)文提到的问题并不(bú)针对在通用场景使用 Rust,只针对将 Rust 用于特(tè)定目标(biāo)和生态(tài)系(xì)统,简单说就(jiù)是 Web API。

注意事项 1:一般情况(kuàng)下,你(nǐ)可以用任何编程语言搭建网站,还(hái)记得基(jī)于 C++ 实现的OkCupid 吗?(译者注,OkCupid 是美国一(yī)个大型线上交友网(wǎng)站)还有一个非(fēi)常流行的(de) 星象应用程(chéng)序(xù),Co-star,它全(quán)部是用 Haskell 编(biān)写(xiě)的。如果你擅(shàn)长其它编(biān)程(chéng)语言,或者可以招聘(pìn)到(dào)擅长这些编程语言的工(gōng)程师,你一样可以取得成功。

注(zhù)意(yì)事项 2:我试图构建的是重 CRUD(增删改查) 的 Web 应用程序 API。它可能(néng)不算是一个(gè) Web“服务”——主要是快速、无数次地执(zhí)行同一个操作,而(ér)是一个 Web“应(yīng)用程序(xù)”——执行了(le)许多不同(tóng)的操作,包含了相当多的业务逻辑。如果你要开(kāi)发的东西(xī)跟我(wǒ)在(zài)做的不(bú)一样,那我的建议可能就不适(shì)合你(nǐ)。如(rú)果你需要的(de)是快速执行一两(liǎng)个操作,比如你(nǐ)正在写一个(gè)支付网关或语音消息(xī)应用程序,那 Rust 可能效果还是不错的(de)。

注意事项 3:这篇文(wén)章写于 2021 年 1 月,如果接下来社区继续发展,Rust 将得到持续(xù)的改进,会变得更好并更易于(yú) Web 应用(yòng)程序开发。

总而(ér)言之,我真的很(hěn)喜欢使用 Rust,这是一(yī)门美丽的编程(chéng)语言,有很多很酷的(de)想法。希望很快(kuài),Rust 会成为能用来构建(jiàn)我(wǒ)想(xiǎng)做的东(dōng)西的最合(hé)适的工具(jù)。不过(guò),现在我想做的(de)很(hěn)多东西都要采用(yòng)不同特性的编程语言才能更好地运行。

 延伸阅读

https://macwright.com/2021/01/15/rust.html


">

    相关信息

    更新时间:2025-07-17 05:58 来源:www.pc.benxi.gl.jian.ww38.viennacitytours.com