Redian新闻
>
受不了 Rust 这些问题,我将后端切换到了 Go

受不了 Rust 这些问题,我将后端切换到了 Go

公众号新闻

作者 | Anthony Oleinik
译者 | 平川
策划 | 刘燕

本文最初发布于 Level Up Coding 博客。

别激动!我能感受到你点击这篇文章时怀有的愤怒。我并不讨厌 Rust——在许多场景中,我都倾向于使用它。所有编程语言都是达成目的的手段。然而,就我要处理的场景而言,Rust 并不是很适合,我不得不把这个项目推倒重来,用 Golang 重写。

该项目是 Hasura 的一个简单的后端 webhook 服务。你可能不了解 Hasura,那是一个 Postgres 数据库封装器,可以即时提供 GraphQL API。对于像我这样独自开发个人兴趣项目的人来说,这非常方便:每个 REST 端点或 GQL 解析器都要编写的话会耗费大量的时间,而且每个模型的 CRUD 操作基本相同。当需要一些比较复杂的逻辑时,它就不那么有效了——为此,Hasura 允许你将 GQL 请求映射到自定义 webhook。举例来说,我就是用这种方法进行 S3 文件上传或身份验证。

问题 1:依赖注入难

Rust 依赖注入是一个有趣的问题。如果你需要一个具体的类型,如:

fn do_stuff(db: &Database) {    db.create(Stuff);         db.read(Stuff);}

你必须给 do_stuff 传递一个 Database 实例;概莫能外!你不能“子类化”Database (Rust 没有子类的概念)。所以,如果你是一个不自己测试代码的程序员,那么这完全没问题;实际上,你只会有一个 Database 的实现,因此也就没有理由让这个函数接受 Database 以外的任何东西。

那我们测试人员呢?我们必须重写函数签名。Database 需要是 trait 类型的,然后我们把那个它在 mock 对象上实现。好吧,还不算太坏。事实上,在 Golang 中,我做的事情基本相同;那到底是从哪里开始有问题的呢?

问题 2:异步 Trait

在 Rust 中,异步很简单,trait 也很简单,但异步 trait 却有些困难。我在 Rust 中找到的大多数异步 trait 示例都用了 async_trait 宏。这很有帮助,我正在用它,体验还不错。

以下是我到目前为止对这个过程的一个总结:

  1. 编写一个结构;开心。

  2. 编写一个测试;意识到无法依赖注入。难过。

  3. 将结构转换为 trait;开心。

  4. 心满意足地依赖注入。

  5. 使用 mockall crate 自动生成 mock。非常非常开心!

  6. 做一个异步 http 调用。

  7. 需要用一个特殊的宏实现异步 trait。

  8. 意识到这个宏无法很好地与 Mockall 一起工作。

  9. 难过。

事后来看,这个问题是有办法解决的。也许在切换到 Go 之前我应该再试一次,但那时,下面这一点已经让我有点沮丧了……

问题 3:编译慢(致命一击)

Rust 的编译时间很糟糕。我们已经听过无数次了;不可能有一种无所不能却没有缺点的语言。那是不可能的——Rust 的缺点是难以理解的生命周期以及糟糕的编译时间。

我有一台漂亮耐用的笔记本电脑 M1 Mac,那可是一头老黄牛。在我的 Mac 上编译 Rust 绝对没有问题。通常,在编写服务器时,我会在本地开发,并且要保证每次有修改时,本地服务器会重新加载,让我可以在提交真正的单元测试之前非常快速地测试功能。两次试验之间需要进行大量的编译;可以接受!还是说,在 Mac 上编译 Rust 没有问题。

在容器里吗?还是算了吧。

对我来说,要编排许多本地服务而又不用费事在每个服务(Hasura、Web 钩子、mock s3、mock oauth 服务器……)中运行 npm run ,最简单的方法是有一个 docker-compose.yaml 文件可以运行所有这些东西。通常就是一个 docker-composition.dev.yaml 文件,因为我实际上并不使用 docker compose 进行部署。只在本地进行开发。然而,这有一个副作用,就是我的 Rust 代码需要在容器中编译,因为:必

  1. 须自动热重载。

  2. 必须在容器里开发。

我有两个选择:要么启动一个可能会跑死整台计算的巨大镜像,以便在其中编译 Rust 代码,要么就要与 3 分多钟的编译时间周旋。开发周期陷入停滞,让我感觉非常低效。我试着改变工作流程,在手动测试之前编写代码和测试,或者不使用自动热加载,但糟糕的是,我就是没能做到。

最后,我咬紧牙关,换成了 Go。让人怀念的 Rust:我非常喜欢编写 Rust 代码。我觉得它漂亮而富有表现力,实用而优雅。

如果我正在编写本地辅助库、性能敏感代码、任何不需要在容器中运行的后端服务……那么,Rust 会是我的第一选择。特别是如果我不需要说服其他任何人使用它。

对于我提到的问题,特别是最后一个问题,如果你有任何解决方法,请务必告诉我。我想让 Rust 回到项目中,我愿意回到旧版本,并将其提升到同等水平。

原文链接:

https://levelup.gitconnected.com/why-i-switched-from-rust-to-go-on-the-backend-28bda21dbee9

声明:本文为 InfoQ 翻译,未经许可禁止转载。

点击底部阅读原文访问 InfoQ 官网,获取更多精彩内容!

今日好文推荐

字节回应员工因没年终奖与 HR 互殴;乐视实行 4 天半工作制:不降薪无 996,研发可准点下班;亚马逊发全员信,拟裁员 1.8 万人|Q 资讯

2022年全球程序员收入报告出炉:首席工程师最高年薪超700万,字节跳动成国内唯一上榜公司

为什么谷歌和苹果都要杀死移动Web?资深工程师揭秘大厂从吹捧到扼杀“内幕”

传奇程序员用“考古”方式剖析微服务利弊:我们都被骗了?

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
疫情最关键时期,即将到来!当下,这些问题你必须知道…Linux 6.1正式发布,带有MGLRU、初始Rust支持千年修得父女缘50岁从高校辞职,我必将后悔吗:告别体制答疑一美国华女疯狂吐槽!“澳洲又贵又无聊!我受不了了,我要离开了...”千万别这么做PPT了,这些问题一定要改!在美中国留学生赴第三国旅游 签证被取消...这些问题要注意紧急召回!澳洲Costco菠菜被严重污染!多人食用后紧急住医!华人赶紧自查,家中有这些问题食品的立即销毁!中疾控发布中小学生寒假健康提示!这些问题要注意→放开,不是由困难模式切换到岁月静好,而是切换到另一种困难模式!受不了Rust 这些问题,我将后端切换到了 Go利好!中澳再增航班,墨尔本恢复一条航线!留学生返澳人数上涨,这些问题需要先了解…NSA:建议从 C/C++ 切换到内存安全语言?"小学文凭混清华,不是活受罪吗"!! 指的是谁呀?弱者逃避问题,强者解决问题,智者消除问题香港通关,这些问题必须要搞清楚!小心被拒!以调试 Rust 的方式来学习 Rust | Linux 中国把“阳”喊成“羊”,我接受不了最关键时期即将到来,当下,这些问题你必须知道…!关于「女性」的那些问题,你有答案了吗?受不了冷战,这些星座跟爱人吵架后很快会求和突发!港股突然急速杀跌,A股也被波及!两大利空突袭?央视意外发声,百度:这些问题吓死人这些问题,真把美国政府问住了!小结:自己装修退休小屋的费用Is the China Belt and Road Initiative a debt trap?Google 宣布支持使用 Rust 开发 Chromium选择“网红语言”值不值?使用Go和Rust的数据库公司七年经验总结通胀持续,澳洲生活成本飙升,更多澳人开始重视储蓄和投资!但这些问题也得当心...微软工程师展望Rust 2023:重写编译器、解决管理问题Go/Rust挑战Java/Python地位少而多:少数民族歌手多“结婚3年,我忍不了他的邋遢,他受不了我的洁癖”:你是婚后多久开始厌倦的?三年来,长三角一体化示范区迎来哪些发展机遇?区域内重点项目进展如何?今天的发布会回应了这些问题HA InfluxDB 作为 Prometheus 的后端存储Rust 语言年度回顾:全球企业如何采用 Rust的?
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。