其实,Rust不适合开发Web API

嵌入式资讯精选 2021-02-02 00:00

Rust 是一门神奇的编程语言,有非常好的 CLI 工具,比如 ripgrep 和 exa。像 Cloudflare 这样的公司正在使用并鼓励人们写 Rust 来运行微服务。Rust 编写的软件可能比 C++ 或 C 更安全、更小、更简洁。

如果我正在编写一个地理编码器、一个路由引擎、一个实时消息平台、一个数据库或一个 CLI 工具,Rust 最合适。

但去年,我试图用 Rust 写一个传统网站的纯 API 服务,Rust 就不合适了。

1缺失很多小功能

Rust 有大量的 Web 服务框架、数据库连接器和解析器。但搭建身份验证服务方面只有非常低层次的组件。Node.js 有 passport.js,Rails 有 devise,Django 有开箱即用的身份验证模型,在 Rust 中,你需要学习如何将共享 Vec 转换到底层加密库才能构建这个系统(译者注,Vec 是一个动态数组,只会自动增长而不会自动收缩。区别于 Array,Vec 具有动态的添加和删除元素的能力,并且能够以 O(1) 的效率进行随机访问。Vec 的所有内容项都是生成在堆空间上的,可以轻易的将 Vec 移出一个栈而不用担心内存拷贝影响执行效率,毕竟只是拷贝栈上的指针)。有些库试图解决这个问题,比如 libreauth,但它才刚刚开始开发。还有很多类似的 Web 框架问题。

SDK 呢?在主流编程语言中,你可以通过一个官方库来接入 Google 云服务、AWS 或 Stripe。这些官方库大都很棒。例如,aws-sdk-js 和 Stripe 库的设计和维护得非常好。

Rust 就不这样,只有少许第三方库,但以这些服务的开发速度,它们真的能够提供高质量的体验吗?

有人会说好吧,X 编程语言太好了,你可以在周末自己写一个 SDK!我必须回答,不。

Rust 的生态系统在其它领域非常丰富。用于构建 CLI、管理并发性、使用二进制数据和底层解析器的 crates 令人印象深刻,非常棒。

2Rust 编译器比以前快,但仍然很慢

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

但与其它编程语言相比,用它构建网站会很慢。它比编译型编程语言 Go 慢得多,也比解释型编程语言 JavaScript、Ruby 和 Python 等慢得多。

一旦代码被编译,一切就变得非常棒了!但在我的情况下,甚至基本 API 功能都不完整,一个不复杂的系统——居然花了 10 多分钟来编译。Google 代码构建的硬件配置很差,每次都会超时,我啥都编译不了。

只要不重建缓存依赖项,缓存就有意义。也许减少依赖会加快 Rust 项目编译。但就像 serde,几乎所有人都使用的 JSON 和其它序列化 / 反序列化程序占用了大量的编译时间。我们是否应该用编译速度更快但缺乏大量文档和生态系统支持的东西来取代 serde?这种取舍非常糟糕。

3Rust 很复杂

Rust 让你从代码维度进行思考,这对系统编程来说非常重要。它让你思考如何共享或复制内存,思考真实但不太可能的小概率事件,并确保妥善处理它们,帮你编写各种各样的高效代码。

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

就拿 Rust 的安全性来说吧。这是它宣传语中的重要部分,这是绝对正确的:Rust 的承诺安全和底层两者兼而有之——它可以在没有垃圾收集器的情况下工作,同时防止基于内存的漏洞。当你读到“安全”的时候,想想 Rust 的竞争对手 C 吧。C 语言中的代码可以引用任意内存,很容易溢出和出错。Rust 代码可以和 C 代码一样快,但是可以保护内存访问,而不需要垃圾收集器或某种运行时检查。

但是 Rust 的内存规则并不比 Node.js 或 Python 更安全,用 Rust 编写的 Web 应用程序在系统上不会比 Python 或 Ruby 应用程序安全。带有垃圾收集器的高级编程语言通常为避免这类漏洞利用和错误而付出性能损失。不能在 JavaScript 中引用未初始化的内存,因为 JavaScript 中不进行内存间的引用。

旁注:这是在描述 Node.js 和其它系统的设计目标——它们确实偶尔会有 bug。Node.js 的缓存对象,就值得读一读。

你要是问一些人,他们会说如果使用不安全的代码,Rust 相比带有内存回收的编程语言是不安全的——包括最流行的 Web 框架 Actix(译者注,Actix 是 Rust 的 Actor 异步并发框架,基于 Tokio 和 Future,开箱具有异步非阻塞事件驱动并发能力,其实现低层级 Actor 模型来提供无锁并发模型,而且同时提供同步 Actor,具有快速、可靠,易可扩展 https://actix.rs/),因为不安全代码允许原始指针的延迟。

如果你正在写一个视频游戏,暂停执行垃圾收集是不好的。如果你在编写微控制器代码,任何内存“开销”或浪费都是非常糟糕的。但是大多数 Web 应用程序可以节省一点内存开销来换取生产性能。

Rust 的其它属性面对的争议几乎一样。它的并发特性是太神奇了,如果你在做一些复杂的事情,需要快速响应,这当然很棒。但如果情况不是这样呢?至少可以说,Rust 的异步生态系统面临着很大挑战:各种不相关的领域中有着不同的异步实现,比如 tokio。

相比较之下,Python 的 Tornado 和 Twisted 异步实现的很奇怪,Node.js 异步实现的很好,但语法都很丑陋。

我确信,Rust 的异步将会稳定和统一,未来会更容易操作,但我现在就要用啊。

4Rust 生态系统不是以 Web 为中心的

很多人正在学 Rust,用 Rust 编写 CLI 应用程序或底层代码,并且玩得非常开心。使用 Rust 编写普通 Web 应用程序的人明显少很多。

这是技术选择中的重要部分:是否有人在使用该工具?他们大致在同一个领域吗?不幸的是,Rust 生态系统中许多令人难以置信的令人兴奋的工作与 Web 应用服务器无关。的确存在一些很有前途的 Web 框架——甚至更高层次的框架,但毫无疑问,它们市场很小。即使是主要的 Web 框架 Actix 也只有几个顶尖贡献者。

如果 Rust 以目前的速度增长,那么社区中的 Web 部分将达到一个临界值,但我认为没有足够多的人使用 Rust 作为网站的实用工具。与其它社区相比,有很多公司致力于使用现有的工具来构建 Web 应用程序,这些工具不是最前沿的,但足够将成熟技术与新技术区分开来。

5Juniper 的 N+1 次查询

这一部分不仅仅是 Rust,它还涉及 GraphQL 生态系统,Rust 参与这个生态系统就是一个例子。

N+1 问题是每个构建 Web 应用程序的人都应该知道的。要点是:你有一页照片(一次查询),你要显示每张照片的作者,会有多少次查询:1,合并照片和作者,或者在检索照片后对每张照片进行查询以获取作者?或者两次,第二次查询 ids 中的 user.id,一次获取所有作者,然后重新设置他们的照片属性。

N+1 查询通常优先使用数据库解决:比如将 N+1 查询改为单个查询,会带来明显的性能优化。我们有很多方法来尝试和解决这些问题:你可以编写 SQL,并尝试使用 CTE 和 JOIN 在单个查询中完成大量工作,就像我们在 Observable 中所做的那样,或者使用像 ActiveRecord 这样的 ORM 层将 N+1 查询转换为可预测查询的快速方法。

Juniper 是一个用于 Rust 应用程序的 GraphQL 服务。GraphQL 基本上都是由前端应用程序定义查询,而不是后端。给它一系列可以查询的东西,然后应用程序(React 或其它)将任意查询发送到后端。

这会让后端变得复杂。任何 SQL 级别的优化都不可能做到——你的服务器正在编写动态 SQL,优化只能依赖 GraphQL 服务,但它不会总是有效。例如:Juniper 默认情况下执行的是 N+1 查询,解决方案 dataloader 还比较粗糙且需要单独维护。因此,最终您将拥有一个非常快的应用程序层,但它所有的时间都花在了极其低效的数据库查询上。

总之,GraphQL 与 NoSQL 数据库配合使用效果非常好,它可以快速为这些类型的请求提供服务。我确信 Facebook 内部有一些特定的数据库与 GraphQL 结合在一起使用效果非常棒,但业内其他企业则非常依赖 Postgres 和同类产品。

6一些注意事项

首先,本文提到的问题并不针对在通用场景使用 Rust,只针对将 Rust 用于特定目标和生态系统,简单说就是 Web API。

注意事项 1:一般情况下,你可以用任何编程语言搭建网站,还记得基于 C++ 实现的 OkCupid 吗?(译者注,OkCupid 是美国一个大型线上交友网站)还有一个非常流行的星象应用程序,Co-star,它全部是用 Haskell 编写的。如果你擅长其它编程语言,或者可以招聘到擅长这些编程语言的工程师,你一样可以取得成功。

注意事项 2:我试图构建的是重 CRUD(增删改查)的 Web 应用程序 API。它可能不算是一个 Web“服务”——主要是快速、无数次地执行同一个操作,而是一个 Web“应用程序”——执行了许多不同的操作,包含了相当多的业务逻辑。如果你要开发的东西跟我在做的不一样,那我的建议可能就不适合你。如果你需要的是快速执行一两个操作,比如你正在写一个支付网关或语音消息应用程序,那 Rust 可能效果还是不错的。

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

总而言之,我真的很喜欢使用 Rust,这是一门美丽的编程语言,有很多很酷的想法。希望很快,Rust 会成为能用来构建我想做的东西的最合适的工具。不过,现在我想做的很多东西都要采用不同特性的编程语言才能更好地运行。

英文原文链接:https://macwright.com/2021/01/15/rust.html

1.国产替代摸不着门儿?快来回看兆易创新直播课!

2.开源的RISC-V能否成为中国“缺芯”的解药?

3.树莓派Pico:仅4美元的MCU

4.MCU支持AI功能的多种原因~

5.2020年,我学习到的20条软件工程准则~

6.状态机思路在嵌入式开发中的应用~

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

嵌入式资讯精选 掌握最鲜资讯,尽领行业新风
评论 (0)
  • 2025年全球人形机器人产业迎来爆发式增长,政策与资本双重推力下,谷歌旗下波士顿动力、比亚迪等跨国企业与本土龙头争相入局,产业基金与风险投资持续加码。仅2025年上半年,中国机器人领域就完成42笔战略融资,累计金额突破45亿元,沪深两市机器人指数年内涨幅达68%,印证了资本市场对智能终端革命的强烈预期。值得关注的是,国家发展改革委联合工信部发布《人形机器人创新发展行动计划》,明确将仿生感知系统、AI决策中枢等十大核心技术纳入"十四五"国家重大专项,并设立500亿元产业引导基金。技术突破方面,本土
    电子资讯报 2025-04-27 17:08 217浏览
  •   无人机部件仿真与模型验证平台系统解析   北京华盛恒辉无人机部件仿真与模型验证平台系统是无人机研发的核心工具,通过多元功能、创新架构和广泛应用,推动无人机技术发展。以下从核心功能、技术架构、应用场景、优势及发展趋势展开解析。   应用案例   目前,已有多个无人机部件仿真与模型验证平台在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润无人机部件仿真与模型验证平台。这些成功案例为无人机部件仿真与模型验证平台的推广和应用提供了有力支持。   一、核心功能   三维建模与可视化
    华盛恒辉l58ll334744 2025-04-26 16:39 236浏览
  •   北京华盛恒辉电磁环境适应性测试系统是针对复杂电磁环境进行仿真、测试与评估的关键设备,以下从系统功能、技术架构、应用场景、核心优势、发展趋势五个维度展开全面解析:   应用案例   目前,已有多个电磁环境适应性测试系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁环境适应性测试系统。这些成功案例为电磁环境适应性测试系统的推广和应用提供了有力支持。   一、系统功能   复杂电磁环境构建   全生命周期测试能力   实时监测与反馈   二、技术架构   模块化设
    华盛恒辉l58ll334744 2025-04-26 17:21 195浏览
  • 速卖通,作为阿里巴巴集团旗下的跨境电商平台,于2010年横空出世,彼时正值全球电商市场蓬勃发展,互联网的普及让跨境购物的需求日益增长,速卖通顺势而为,迅速吸引了全球目光。它以“让天下没有难做的生意”为使命,致力于打破国界限制,搭建起中国商家与全球消费者之间的桥梁。在其发展的黄金时期,速卖通取得的成绩令人瞩目。在欧洲市场,速卖通一度成为第一大电商平台。根据第三方机构《欧洲跨境商务》的评选,速卖通凭借出色的服务和消费者口碑,在“欧洲十大跨境电商平台”中脱颖而出,力压来自美国的亚马逊和eBay等电商巨
    用户1742991715177 2025-04-26 20:23 162浏览
  •  集成电路封装测试是确保芯片性能与可靠性的核心环节,主要包括‌晶圆级测试(CP测试)‌和‌封装后测试(FT测试)‌两大阶段,流程如下:一、晶圆级测试(CP测试)1.‌测试目的‌:在晶圆切割前筛选出功能缺陷或性能不达标的晶粒(Die),避免后续封装环节的资源浪费,显著降低制造成本。2.‌核心设备与操作‌l ‌探针台(Prober)‌:通过高精度移动平台将探针与晶粒的Pad jing准接触,实现电气连接。l ‌ATE测试机‌:提供测试电源、信号输入及功能向量,接收晶粒反
    锦正茂科技 2025-04-27 13:37 161浏览
  •     今天,纯电动汽车大跃进牵引着对汽车电气低压的需求,新需求是48V。车要更轻,料要堆满。车身电子系统(电子座舱)从分布改成集中(域控),电气上就是要把“比12V系统更多的能量,送到比12V系统数量更少的ECU去”,所以,电源必须提高电压,缩小线径。另一方面,用比传统12V,24V更高的电压,有利于让电感类元件(螺线管,电机)用更细的铜线,缩小体积去替代传统机械,扩大整车电气化的边界。在电缆、认证行业60V标准之下,48V是一个合理的电压。有关汽车电气低压,另见协议标准第
    电子知识打边炉 2025-04-27 16:24 160浏览
  • 探针台作为半导体制造与测试的核心设备,通过精密定位与多环境适配能力,支撑芯片研发、生产及验证全流程。以下是其关键应用领域与技术特性:一、核心功能支撑1.‌电性能测试与分析‌l 在晶圆切割前,探针台直接接触芯片电极,测量阈值电压、漏电流、跨导等200余项参数,用于评估良品率及优化工艺设计。l 支持单晶体管I-V曲线测量,定位栅极氧化层厚度偏差(精度达0.2nm),为器件性能分析提供数据基础。2.‌纳米级定位与测量‌l 定位精度达±0.1μm,满足5nm及以下制程芯片的
    锦正茂科技 2025-04-27 13:09 138浏览
  • 在电子电路设计和调试中,晶振为电路提供稳定的时钟信号。我们可能会遇到晶振有电压,但不起振,从而导致整个电路无法正常工作的情况。今天凯擎小妹聊一下可能的原因和解决方案。1. 误区解析在硬件调试中,许多工程师在测量晶振时发现两端都有电压,例如1.6V,但没有明显的压差,第一反应可能是怀疑短路。晶振电路本质上是一个交流振荡电路。当晶振未起振时,两端会静止在一个中间电位,通常接近电源电压的一半。万用表测得的是稳定的直流电压,因此没有压差。这种情况一般是:晶振没起振,并不是短路。2. 如何判断真
    koan-xtal 2025-04-28 05:09 106浏览
  • 探针台作为高精度测试设备,在光电行业的关键器件研发、性能测试及量产质量控制中发挥核心作用,主要涵盖以下应用场景与技术特性:一、光电元件性能测试1.‌光电器件基础参数测量‌l 用于LED、光电探测器、激光器等元件的电流-电压(I-V)特性、光功率、响应速度等参数测试,支撑光通信、显示技术的器件选型与性能优化。l 支持高频信号测试(如40GHz以上射频参数),满足高速光调制器、光子集成电路(PIC)的带宽与信号完整性验证需求。2.‌光响应特性分析‌l 通过电光转换效率测
    锦正茂科技 2025-04-27 13:19 112浏览
  • 晶振在使用过程中可能会受到污染,导致性能下降。可是污染物是怎么进入晶振内部的?如何检测晶振内部污染物?我可不可以使用超声波清洗?今天KOAN凯擎小妹将逐一解答。1. 污染物来源a. 制造过程:生产环境不洁净或封装密封不严,可能导致灰尘和杂质进入晶振。b. 使用环境:高湿度、温度变化、化学物质和机械应力可能导致污染物渗入。c. 储存不当:不良的储存环境和不合适的包装材料可能引发化学物质迁移。建议储存湿度维持相对湿度在30%至75%的范围内,有助于避免湿度对晶振的不利影响。避免雨淋或阳光直射。d.
    koan-xtal 2025-04-28 06:11 89浏览
  • 一、智能家居的痛点与创新机遇随着城市化进程加速,现代家庭正面临两大核心挑战:情感陪伴缺失:超60%的双职工家庭存在“亲子陪伴真空期”,儿童独自居家场景增加;操作复杂度攀升:智能设备功能迭代导致用户学习成本陡增,超40%用户因操作困难放弃高阶功能。而WTR096-16S录音语音芯片方案,通过“语音交互+智能录音”双核驱动,不仅解决设备易用性问题,更构建起家庭成员间的全天候情感纽带。二、WTR096-16S方案的核心技术突破1. 高保真语音交互系统动态情绪语音库:支持8种语气模板(温柔提醒/紧急告警
    广州唯创电子 2025-04-28 09:24 106浏览
我要评论
0
6
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦