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

导航至

本文最初发表于 The New Stack,并在此处经许可转载。

这是一个简短的案例研究,探讨了将导致一家成功的公司花费时间和资源,完全用 Rust 重写其旗舰产品核心的逻辑和动机。

将一种编程语言称为 Rust 几乎显得用词不当。Rust 是腐蚀产生的脆性副产品——通常不会激发信心。但幸运的是,软件开发人员与冶金学家有非常不同的担忧。在数字领域,Rust 是一项颠覆性技术。

以下是一个简短的案例研究,探讨了将导致一家成功的公司花费时间和资源,完全用 Rust 重写其旗舰产品核心的逻辑和动机。InfluxData 制造了 InfluxDB,这是世界领先的时间序列数据库。在时间序列数据用例方面,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 等顺序语言更先进。例如,在 JavaScript 中,当异步函数在 Node.js 中执行时,用户无法控制异步函数的执行顺序。异步运行时是经过优化的运行时,可在特定环境中执行异步函数。然而,在 Rust 中,开发人员可以使用异步运行时来精细控制异步函数的执行顺序。

这仅仅是 Rust 优势的冰山一角。然而,内存管理和运行时控制是促使 InfluxData 决定用 Rust 构建其新数据库引擎的两个促成因素。

Rust 的挑战

虽然 Rust 具有很多优势,但它也面临着自身的挑战。最重要的是它具有很高的学习曲线。它是一种独特设计的编程语言,具有其自身完整的设计模式。在某些情况下,这些独特的品质是由使 Rust 具有吸引力的能力驱动的,例如借用检查器。与具有 C++ 或 Swift 等静态编程语言背景的开发人员相比,仅具有 Python、Ruby 或 JavaScript 等动态编程语言背景的开发人员往往更难学习 Rust。

开发人员必须适应的另一个难点是 Rust 漫长的编译时间。这给开发人员带来了编写优化编译时间的代码的压力。但这种艰难的攀登可能是值得的,因为 Dix 认为,开发人员和公司将越来越多地用 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 带来的不同。