写点什么

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

  • 2023-01-03
    北京
  • 本文字数:1767 字

    阅读完需:约 6 分钟

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

本文最初发布于 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

2023-01-03 18:0115934
用户头像
刘燕 InfoQ高级技术编辑

发布了 1112 篇内容, 共 571.4 次阅读, 收获喜欢 1979 次。

关注

评论

发布
暂无评论
发现更多内容

数智报告:一键合并精准高效

用友智能财务

用友 财务 数智化 智能财务 数智报告

非凸科技受邀出席AI SPARK活动,共探生成式AI驱动金融新生态

非凸科技

宁德新能源:时序数据库 TDengine 支撑百万级工业设备实时数据高效治理

TDengine

数据库 tdengine 时序数据库

最新字节跳动运维云原生面经分享

王中阳Go

Go 字节跳动 面经

【等保知多少】企业过等保要点看这里!

行云管家

网络安全 等保 等保测评

25年甘肃省等保测评机构名单汇总

行云管家

等保 等级保护 等保测评

AI智能体平台的组件和功能

北京木奇移动技术有限公司

AI智能体 软件外包公司 AI技术应用

通义灵码正式上线 Qwen3,编程智能体马上来了!

阿里云云效

阿里云 云原生 通义灵码 Qwen

CRaC 技术深度解析

mazhen

Java Linux Serverless Cloud Native crac

时序数据库 TDengine × Perspective:你需要的可视化“加速器”

TDengine

数据库 tdengine 时序数据库

AI智能体平台的搭建

北京木奇移动技术有限公司

AI智能体 软件外包公司 AI技术应用

【京东招聘专场】京东零售&科技诚邀测试开发精英!多地热招中!

测试人

软件测试

什么是委外管理?委外管理到底有什么用?

积木链小链

数字化转型 智能制造 中小企业 委外管理

Nacos 3.0 正式发布:MCP Registry、安全零信任、链接更多生态

阿里巴巴云原生

nacos MCP

中关村科学城工业软件创新暨开源峰会在海淀成功举办

极客天地

开放注册!RootTalk Sandbox沙盒系统正式上线

乘云数字DataBuff

可观测性 故障定位 Demo 运维监控

《Operating System Concepts》读后感

codists

操作系统

稳定币迎来ChatGPT 时刻,如何驱动DeCloud?

PowerVerse

defi 稳定币 DeCloud

通义灵码正式上线 Qwen3,编程智能体马上来了!

阿里巴巴云原生

阿里云 云原生 通义灵码 Qwen

京东商品列表 API 接口使用指南

tbapi

京东API接口 京东API 京东商品列表接口 京东商品采集

聚焦查询引擎优化:技术人如何在国产数据库项目中不断突破

TDengine

数据库 tdengine 时序数据库

使用 Amazon Nova Lite 实现多快好省的智能视频审核

亚马逊云科技 (Amazon Web Services)

4.29 晚直播预告 | 清华团队揭秘,时序大模型如何让数据“活”起来?

Apache IoTDB

PAI Model Gallery 支持云上一键部署 Qwen3 全尺寸模型

阿里云大数据AI技术

人工智能 阿里云 LLM PAI Qwen3

AI智能体的技术架构

北京木奇移动技术有限公司

AI智能体 软件外包公司 AI技术应用

如何用豆包做PPT?PPT自动生成全攻略!

职场工具箱

人工智能 PPT AIGC AI生成PPT 豆包

全开源、私有化部署!轻量级用户行为分析系统-ClkLog

ClkLog

开源 数据分析 埋点 用户行为分析 用户画像

万界星空科技QMS质量管理系统几大核心功能详解

万界星空科技

万界星空科技 QMS 质量管理系统 生产质量管理 产品质量管理

千亿级打点PV的成本治理实践

百度Geek说

百度 成本治理 打点治理

AI智能体平台的开发流程

北京木奇移动技术有限公司

AI智能体 软件外包公司 AI技术应用

详细剖析Java动态线程池的扩容以及缩容操作

电子尖叫食人鱼

Java

受不了Rust 这些问题,我将后端切换到了 Go_AI&大模型_Anthony Oleinik_InfoQ精选文章