Andre Bogus

返回 Qdrant 文章

·

2023年5月11日

使用 Rust 构建 Qdrant

Why Rust?

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

Java 现在也已经有 30 多年的历史了。凭借经过吞吐量优化的虚拟机,它通常至少可以与原生服务相媲美,而且工具链非常出色。可移植性也出奇地好,尽管垃圾回收(GC)不适合低内存应用,并且通常需要大量内存才能提供良好性能。话虽如此,对吞吐量的关注导致了令人担忧的 GC 停顿,从而引起延迟峰值。此外,庞大的运行时环境会带来较高的启动延迟,需要解决。

Scala 也构建在 JVM 上,尽管有原生编译器,但存在兼容性问题。因此 Scala 和 Java 有类似的局限性,尽管它有一些不错的高级特性(其中一部分 Java 最近才复制),但它仍然不像 C++ 那样提供对内存布局相同程度的控制,因此同样不适合。

Python 仅比 Java 年轻一点,但在 ML 项目中无处不在,这主要归功于其工具链(尤其是 jupyter notebook)、易于学习以及与大多数 ML 堆栈的集成。它没有传统的垃圾回收器,而是选择普遍的引用计数,这在一定程度上帮助降低了内存消耗。尽管如此,除非你仅将其用作高性能模块的胶水代码,否则你可能会发现自己需要等待结果。此外,让复杂的 Python 服务在负载下稳定运行是一个严峻的技术挑战。

迈向未知

因此,Andrey 四处寻找适合这项挑战的较新的语言。经过一番搜索,出现了两个竞争者:Go 和 Rust。对这两种语言都不了解的 Andrey 查阅了文档,并被 Rust 吸引了,因为它承诺可以在系统编程中避免普遍的内存不安全问题。

这个早期决定一次又一次地得到了验证。刚开始学习 Rust 时,编译器的错误消息非常有用(而且在此期间只变得更好)。当你不需要与垃圾回收器斗争并可以完全控制栈和堆时,很容易保持内存占用较低。除了广为人知的内存安全性之外,许多编写 C++ 时可能遇到的“陷阱”已经被精心设计排除。而且,如果你不必担心数据竞争,并行化任务会容易得多。

有了用 Rust 编写的 Qdrant,我们可以提供让我们高枕无忧的云服务,这得益于 Rust 久负盛名的健壮性。当前的 Qdrant Docker 容器大小仅略超过 50MB——试试看有多小巧。至于性能……请看一些基准测试

而且我们也不必牺牲人体工程学,无论是对我们自己还是对用户而言。当然,也有缺点:Rust 的编译时间通常与 C++ 相似,尽管近年来学习曲线已大大放缓,但仍无法与 Python 或 Go 等易于入门的语言相比。但学习它是一次性的成本。这与 Go 不同,你可能会发现 Go 的表面简单只是肤浅的

顺畅即快速

复杂的类型系统带来了巨大的回报,许多 bug 甚至还没提交就被发现了。Web 服务的生态系统也已经相当先进,可能不如 Java,但肯定可以与 Go 媲美或超越 Go。

有些人可能认为 Rust 的严格性会减慢开发速度,这仅在你试图走捷径时成立。然而,经验确凿地表明这是一个净收益。事实上,Rust 让我们能够“贴墙”,这让我们变得更快,而不是更慢。

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

我们信任 Rust

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

总而言之,选择 Rust 是一个带来巨大收益的幸运猜想。Rust 仍然是我们并非秘密的秘密武器。

主要收获

Rust 对 Qdrant 的优势:Rust 提供了内存安全和控制,而无需垃圾回收器,这对于 Qdrant 的高性能云服务至关重要。

  • 低开销:Qdrant 基于 Rust 的系统提供了高效率,Docker 容器体积小,性能基准测试表现强劲。

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

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

  • 社区与人才:支持性的 Rust 社区和越来越多的 Rust 开发者使得 Qdrant 更容易成长和创新。

  • 此页面是否有用?

点赞图标

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

在此页面上