用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服务在负载下稳定运行是一项严峻的技术挑战。
走向未知
所以安德烈环顾四周,看看哪些年轻语言能够应对这个挑战。经过一番搜索,两个竞争者浮现出来:Go 和 Rust。安德烈对这两者都不熟悉,于是查阅了文档,并对 Rust 产生了兴趣,因为它承诺可以进行系统编程而不必担心普遍的内存不安全。
这一早期决策已经一次又一次地得到验证。在首次学习Rust时,编译器的错误信息非常有帮助(而且在这段时间里只会有所改善)。当不需要与垃圾回收器斗争并且完全控制栈和堆时,保持内存占用低是很容易的。除了备受宣传的内存安全外,在编写C++时可能遇到的许多陷阱已经被细致地设计消除。如果不必担心数据竞争,那么并行化任务就容易得多。
由于Qdrant是用Rust编写的,我们可以提供让我们不过于焦虑的云服务,这要归功于Rust著名的稳健性。目前的qdrant docker容器的大小略超过50MB——试试这个大小。至于性能……这里有一些 基准测试。
而且我们不必在人体工程学上妥协,这对我们和我们的用户都如此。当然,也有缺点:Rust 的编译时间通常与 C++ 相似,尽管近年来学习曲线已经大大减缓,但仍然无法与 Python 或 Go 等入门简单的语言相匹敌。但是,学习它是一项一次性的成本。将此与 Go 进行对比,你可能会发现 表面上的简单只是表面现象。
平滑就是快速
类型系统的复杂性在于避免了一些甚至没有提交的bug,带来了巨大的收益。网络服务的生态系统也已经相当先进,虽然可能没有达到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更容易成长和创新。

