返回 Qdrant 文章

为什么选择 Rust?

Andre Bogus

·

2023年5月11日

Why Rust?

用 Rust 构建 Qdrant

查看 GitHub 仓库,你会发现 Qdrant 是用 Rust 构建的。其他产品可能用 C++、Go、Java 甚至 Python 编写。那么 Qdrant 为什么选择 Rust 呢?我们的创始人 Andrey 最初用 C++ 构建了第一个原型,但他不相信自己能熟练掌握这种语言,将其扩展到生产系统(坦率地说,他把它比作自断一腿)。他精通 Java 和 Scala,也懂一些 Python。然而,他认为这两者都不太合适。

Java 至今已有 30 多年的历史。凭借吞吐量优化的虚拟机,它通常至少能与原生服务平分秋色,并且其工具非常出色。此外,它的可移植性出人意料地好,尽管其 GC 不适合低内存应用,并且通常需要大量的 RAM 才能提供良好的性能。即便如此,对吞吐量的关注也导致了可怕的 GC 暂停,从而引起延迟峰值。而且,庞大的运行时会带来较高的启动延迟,需要设法解决。

Scala 也构建在 JVM 之上,尽管有原生编译器,但存在兼容性问题。因此 Scala 共享了 Java 的局限性,虽然它有一些不错的高级便利功能(Java 最近才复制了其中一部分),但它仍然无法提供像 C++ 那样对内存布局的控制级别,所以它同样被淘汰了。

Python 比 Java 稍年轻一些,在机器学习项目中无处不在,主要得益于其工具(尤其是 jupyter notebooks)、易学性和与大多数机器学习堆栈的集成。它没有传统的垃圾收集器,而是选择普遍的引用计数,这在一定程度上帮助了内存消耗。话虽如此,除非你只将其用作高性能模块的粘合代码,否则你可能会发现自己要等待结果。此外,让复杂的 Python 服务在负载下稳定运行是一个严峻的技术挑战。

进入未知领域

于是 Andrey 四处寻找哪些更年轻的语言能胜任这项挑战。经过一番搜索,Go 和 Rust 这两个竞争者脱颖而出。两者都不了解的 Andrey 查阅了文档,并发现 Rust 承诺在没有普遍内存不安全的情况下进行系统编程,这让他很感兴趣。

这个早期决定一次又一次地得到了验证。初学 Rust 时,编译器的错误消息非常有帮助(并且在此期间只增不减)。当一个人不必与垃圾收集器搏斗,并且可以完全控制栈和堆时,很容易保持低内存占用。除了广为人知的内存安全之外,许多在编写 C++ 时可能遇到的“枪口”都被精心设计排除了。如果不必担心数据竞争,并行化任务也容易得多。

有了用 Rust 编写的 Qdrant,我们可以提供不会让我们夜不能寐的云服务,这要归功于 Rust 著名的健壮性。一个当前的 Qdrant Docker 容器大小刚刚超过 50MB——试试看。至于性能……请看一些 基准测试

我们也不必在人体工程学上妥协,无论是对我们还是对我们的用户。当然,也有缺点:Rust 的编译时间通常与 C++ 相似,尽管近年来学习曲线已大大降低,但仍无法与 Python 或 Go 等易入门语言相比。但学习它是一次性成本。相比之下,Go 的表面简单性可能只是表面现象

流畅即快速

类型系统的复杂性带来了巨大的好处,在代码提交之前就消除了许多错误。Web 服务的生态系统也已经相当先进,或许还没有达到 Java 的水平,但肯定与 Go 相当或超越 Go。

有些人可能认为 Rust 的严格性会减慢开发速度,这只在它不允许你走任何捷径的程度上是正确的。然而,经验已经明确表明,这是一个净收益。事实上,Rust 让我们能够贴着墙跑,这让我们更快,而不是更慢。

Rust 程序员的就业市场当然不如 Java 或 Python 程序员那么大,但该语言终于进入主流,我们获取和留住顶尖人才没有任何问题。作为一个开源项目,当我们收到贡献时,我们无需检查 Rust 已经排除的各种错误。

我们信任 Rust

最后,Rust 社区非常友好,我们很高兴能成为其中的一员。而且我们似乎并不孤单。大多数大型 IT 公司(尤其是亚马逊、谷歌、华为、Meta 和微软)都已开始投资 Rust。它已经应用于 Windows 字体系统,并正在进入 Linux 内核(构建支持已包含在内)。在机器学习应用中,Rust 已经过 Aleph Alpha 和 Huggingface 等众多公司的试用和验证。

总而言之,选择 Rust 是一个幸运的猜测,为 Qdrant 带来了巨大的好处。Rust 仍然是我们不那么秘密的武器。

关键要点

  • Rust 对 Qdrant 的优势: Rust 在没有垃圾收集器的情况下提供了内存安全和控制,这对于 Qdrant 的高性能云服务至关重要。

  • 低开销: Qdrant 基于 Rust 的系统提供了效率,具有小型 Docker 容器大小和强大的性能基准。

  • 复杂性与简单性: Rust 严格的类型系统在开发早期减少了错误,尽管初始学习曲线较高,但从长远来看速度更快。

  • 主要参与者的采纳: 亚马逊、谷歌和微软等大型科技公司正在采用 Rust,进一步验证了 Qdrant 的选择。

  • 社区和人才: 支持性的 Rust 社区和不断增长的 Rust 开发者可用性使 Qdrant 更容易成长和创新。

此页面有用吗?

感谢您的反馈!🙏

我们很抱歉听到这个消息。😔 您可以在 GitHub 上编辑此页面,或创建一个 GitHub 问题。