用Rust开发MeiliSearch

435 阅读6分钟

在这次采访中,我与MeiliSearch的联合创始人兼首席运营官Thomas Payet进行了交流。MeiliSearch是一个开源搜索引擎,在撰写本文时,它是GitHub上星级最高的20个Rust项目之一。我们谈论了MeiliSearch,以及Rust及其生态系统如何帮助他们创建了它。

进一步阅读,了解他们使用Rust的经验,并发现启动自己的开源项目的技巧。

你能告诉我们一些关于你的公司和你在那里的角色吗?

MeiliSearch是一个开源的搜索API。自从计算机存在以来,搜索一直是一个问题。今天,大多数人在使用谷歌或亚马逊时已经习惯了超级好的搜索结果,但如果你没有这些大科技公司的手段,要提供这样的用户体验是很有挑战性的。在MeiliSearch,我们正在开发一种开源技术,我们认为这种技术可以帮助很多开发者提供开箱即用的绝佳搜索体验。

我是MeiliSearch背后的公司Meili的联合创始人之一(我们有三个)和首席运营官。我的角色包括同步团队,确保每个人都能在我们公司内做到最好,同时遵循同一个目标。我们中的大多数人内心都是开发者,由于我可能是技术含量较低的人之一,所以我是最早改变角色以支持我们组织发展的人之一。

Thomas Payet

MeiliSearch代码库中的哪些部分是用Rust编写的?

MeiliSearch是一个由一个引擎和多个SDK以及不同语言和框架的库组成的项目,以方便核心引擎的使用。该引擎是 100% 用 Rust 编写的,并且我们与社区一起维护了 8 种不同语言的 20 多个集成项目。

我们尽量不成为任何特定技术的拥护者;在内部,我们只会选择最适合的工具来完成工作。)

你是如何决定在项目中使用Rust的?Rust的任何优势,如速度或类型/内存安全,是否影响了你们的选择?

当然,速度和安全是使用Rust的主要论据。

对于搜索引擎来说,两个关键的东西是性能和相关性。只要你的算法和逻辑是好的,相关性可以在任何语言中完成。当涉及到性能时,你要么用C++,要么用Rust,要么用Go。

在我们以前的工作中,我们用Go建立了一个搜索引擎,在设计一个面向性能的程序时,我们很快就了解到了垃圾收集语言的缺点。在运行基准测试时,我们发现了一些减速现象,我们很快意识到,是常规的垃圾收集使整个系统变慢了。^^

说到C++,从长远来看,我们似乎更难维护一个C++代码库。另外,我们的CTO kero从第一个稳定版本开始就是一个Rust开发者。

最后,我们从来没有做出使用Rust的 "决定",因为对我们来说,Rust听起来非常明显,是我们需要的工具。

Rust在什么地方很好用,在你们的堆栈中又有什么不足?

Rust的生态系统是现代的,而且它作为一种日常语言,在GitHub上的实际贡献流程中非常容易使用。我们对使用Rust进行构建感到非常有信心,因为它消除了我们使用其他语言可能存在的很多不确定性。我们可以专注于我们面临的其他挑战,如设计和性能。

一个强大的CS研究者社区实现了最先进的优化的底层库,我们经常从中受益。另一方面,我们进行了多次反复,为服务器寻找合适的HTTP框架,最后使用了actix-web,这是最适合我们使用情况的。

有什么特别的Rust库是你在开发过程中发现非常有用的,并想提及的?

有很多,但这里是我们的前三名:

  • 来自BurntSushi的fst。它允许我们在单词字典中存储和搜索,而且性能非常好。
  • 来自fulmicoton的Levenshtein-automaton。我们用它来从字典中获得具有特定列文斯坦规则的单词,速度非常快。
  • roaring-rs,我们用它来优化集合操作。

在用Rust开发MeiliSearch时,最大的挑战是什么?

在MeiliSearch的路线图上,有一些我们想提供的分布式系统功能,比如高可用性和分片。

我们非常羡慕Hashicorp的GoRaft库。我希望我们在Rust中也有类似的东西,但到目前为止,我们还没有找到这样一个板块,可以帮助我们使用共识算法来轻松建立MeiliSearch集群。

几乎从两年半前我们开始做这个项目的时候,我们就已经开始考虑这个问题了,我们正在尝试整合不同的Raft实现库,但是我们还没有找到符合我们期望的。这是我们的路线图中最大的挑战之一。

我在MeiliSearch的GitHub资料中看到一个名为milli的仓库。这是不是MeiliSearch的未来?你愿意谈一谈吗?

当然。^^

随着我们的团队和项目的发展,我们在不断地学习。我们在去年意识到,为了方便外部贡献者的入职和新功能的开发,我们需要重新架构整个代码库,使其更具可读性和可维护性。

我们的首席技术官kero,几乎在一年前(2020年8月)就开始了这个新的引擎迭代工作,我们计划在未来几个月内发布它。

我们在内部面临着一些困难,要优先考虑引擎的新迭代工作,同时保持MeiliSearch的最新稳定版本的更新。尽管如此,我们还是迫不及待地要正式发布它。性能的提高是令人难以置信的。

millirepo承载了核心引擎库的第4次迭代,但使用该库使其成为可用的二进制文件的代码将在MeiliSearch仓库中发布。

据我所知,MeiliSearch是完全开源的,你们是如何支持它的?

我们在为路易威登工作的时候开始了这个项目,作为承包商。我们在与他们一起工作时开发了大部分项目。在某些时候,我们意识到我们必须从风险投资公司筹集资金,以专注于开源项目。

我们认为我们可以通过围绕MeiliSearch建立一个企业,将MeiliSearch作为一个云产品(SaaS)来销售,并以商业许可的方式向有特殊需求的公司销售特定的功能,从而使MeiliSearch能够持续发展。

对于那些想要启动自己的开源Rust项目的人(可以是技术性的,也可以是非技术性的),你有什么建议吗?

开发和维护一个开源项目可以迅速成为整个团队的全职工作。我建议任何想开始维护开源项目的人都要找人一起工作,因为还有很多其他事情要做:你要写文档、贡献指南、回答问题和拉动请求

与互联网上的陌生人一起工作,你可能永远也见不到他们,这很可爱,但如果你一个人做,恐怕很快就会被压垮。