很久以前,在一个遥远的服务器上……

导航至

本文最初发布在The New Stack,在此得到授权转载。

以下是简要案例研究,探讨了物流和动机,这些因素将引导一家成功公司将时间和资源投入到完全重写其旗舰产品核心的Rust语言中。

将编程语言称为Rust几乎是一种误称。Rust是腐蚀的脆弱产物——通常不会激发人们的信心。但幸运的是,软件开发人员与冶金学家有着非常不同的关注点。在数字领域,Rust是一个颠覆者。

以下是一个简要的案例研究,探讨了物流和动机,这些因素可能导致一家成功的企业投入时间和资源,完全重写其旗舰产品InfluxDB的核心,而InfluxData正是全球领先的时序数据库。在时序数据用例方面,InfluxDB的1.x和2.x版本非常适合指标。它们能够在一定程度上处理分析用例,但总存在高基数数据影响数据库性能的风险。

InfluxDB的愿景不仅仅是掌握指标,而是提供针对所有时序用例的解决方案。为了实现这一目标,开发者需要解决基数问题。这样做将为时序数据和InfluxDB打开大门。

当开发者寻求解决基数问题的解决方案时,他们清楚地意识到,为了实现他们希望达到的目标,他们需要重写InfluxDB核心的部分内容。他们需要构建一个列式数据库,作为一个根植于开源并致力于开源的公司,他们转向Apache Arrow作为新数据库版本的列式框架。1.x和2.x版本是用Go编写的,但InfluxData的创始人兼首席技术官保罗·迪克斯(Paul Dix)看到了尝试不同东西的机会。这就是Rust的诞生。

为什么选择Rust?

Rust为开发者提供了许多吸引人的特性。时序数据的实时性带来了显著的性能需求。Rust具有内在的性能能力,可以支持时序数据和用例的特性。例如,Rust依赖于无畏并发。这是一种系统编程方法,它强制对不同的编程范式进行规范,帮助开发者减轻或消除代码中的微妙错误。这种无畏并发方法的另一个好处是,它使得应用易于重构而不会引入新的错误。借用检查器是Rust的另一个关键方面。它帮助用户管理内存,并在使用之前初始化所有变量。这防止用户无意中多次使用相同的值。

使用Rust的一些额外好处包括其库可以导出一个与许多不同编程语言兼容的外部函数接口(FFI)。这提供了扩展性和互操作性,使得Rust成为广泛应用程序的重大潜在增值。Rust使用Crates.io打包系统,为开发者提供了他们所需的一切。在Rust中,错误是一等公民,开发者无需处理垃圾收集器。

Rust还让开发者比许多其他语言对运行时拥有更多的控制权。它的async/await工具比顺序语言如JavaScript更先进。例如,在Node.js中,用户无法控制异步函数的执行顺序。异步运行时是在特定环境中优化执行异步函数的运行时。然而,在Rust中,开发者可以使用异步运行时对异步函数的执行顺序进行细粒度控制。

这只是Rust优势的一小部分。然而,内存管理和运行时控制是导致InfluxData决定在Rust中构建其新数据库引擎的两个贡献因素。

Rust的挑战

虽然Rust具有许多优点,但也存在一些挑战。其中最重要的是它的学习曲线较高。它是一种独特设计的编程语言,拥有自己的设计模式。在某些情况下,这些独特之处正是Rust吸引人的地方,比如借用检查器。只有动态编程语言背景(如Python、Ruby或JavaScript)的开发者比有静态编程语言(如C++或Swift)背景的开发者更难学习Rust。

开发者必须适应的另一个难题是Rust的漫长编译时间。这给开发者带来了写优化编译时间的代码的压力。但这个艰难的攀登可能值得,因为Dix相信,未来开发者和公司将会越来越多地使用Rust来编写高性能服务器软件。

支持转向Rust

由于对Rust开发者的需求持续增加,雇佣经验丰富的Rust开发者可能并非总是可行的选择。因此,对于个人和公司来说,利用可用的资源来缓解该语言的陡峭学习曲线非常重要。Rust是一种开源语言,有一个不断壮大的社区支持它,所以对于有志的开发者来说,依靠社区是一个很好的起点。

Rust成果

InfluxData旨在扩展其领先的时间序列数据库的分析能力,并使用Rust完成了这个任务。InfluxDB 3.0是多年研究和发展的结果。它将几个关键数据库概念应用到时间序列用例中。列式数据库并不新鲜,存储和计算的分离概念也不新鲜。但将这些概念结合起来用于时间序列用例,结果是一个可以大规模推动监控和实时分析项目的数据库。

InfluxDB 3.0可以处理无限基数的数据,可以单独扩展计算和存储,并支持原生SQL查询。与InfluxDB OSS先前版本相比,其性能提升是巨大的。对于领先的数据,有“热”存储层可以进行实时分析。结合列式数据库和使用Apache Parquet作为持久化格式,带来了数据压缩的大幅提升。使用低成本云对象存储“冷”数据可以将存储成本节省高达90%,同时使用户能够更长时间地保留更多、更高粒度的数据。

Rust是InfluxDB 3.0创建中的关键因素。虽然决定重写数据库核心是一个重大的决定,但最终结果证明了这一点。得益于Rust,InfluxDB有望在未来可预见的时期内保持时间序列类别的领先地位。

亲自尝试InfluxDB,看看Rust带来的差异。