关注「Rust编程指北」,一起学习 Rust,给未来投资
我们的小团队着手构建下一代流处理框架,目标是极高的可扩展性、性能和弹性的内存状态。根据经验,我们觉得Apache Storm、Apache Spark 等常用的解决方案并没有针对很多场景进行优化,比如需要处理大量数据,或者需要非常低的延迟。此外,现有的 Apache 工具依赖于 Java —— 特别是 JVM —— 很难获得可预测的、非常低延迟的结果(也不适合现代数据科学算法和工作流)。我们相信我们可以做得更好——处理更多数据、更快、成本更低。
我们很清楚,用 Java 构建另一个分布式计算框架不是好的解决方案。我们在 Python 中构建了一个初始原型来测试一些想法,但我们甚至在开始之前就知道,由于各种性能、灵活性和可扩展性原因,一旦我们开始构建实际框架,Python 就不可能了。
那么如果不是 Java,也不是 Python,我们应该选择什么语言呢?我们知道我们将编写性能密集、高度并发的代码。我们考虑过 C++、Pony[1] 和 Rust[2]。从纯粹的性能角度来看,C 或 C++ 将是一个不错的选择。但是,根据过去的经验,我们知道用 C/C++ 构建高度分布式的数据处理应用程序并非易事[3]。我们排除了 C++,因为我们希望在内存和并发方面有更好的安全保证。
如果我们选择 Rust,我们将需要构建自己的运行时来处理并发。另一方面,Pony 是一种具有强大内存和并发安全保证的语言,还具有高性能、基于 actor 的运行时。我们认为这将是快速行动并构建可靠、高性能系统的最佳方式。我们的赌注为我们软件的早期迭代带来了回报。尽管与 Rust 一样,Pony 也有学习曲线,但我们发现一旦通过它,该语言使并发编程变得容易,并消除了我们过去处理过的所有类型的错误。而且因为我们不必构建并发运行时,我们能够非常快速地专注于我们的核心领域。Pony 还提供了一个基于 actor 的并发垃圾收集器,旨在避免长时间的“Stop The World”暂停。这很关键,因为我们的目标是非常低、可预测的尾部延迟[4]。
事实证明,对于我们围绕我们的最初目标而言,Pony 是一种很棒的语言。它帮助我们快速解决难题,而无需从头开始构建并发运行时,并使我们能够实现雄心勃勃的性能目标。
然而,与此同时,数据科学和机器学习继续呈爆炸式增长,我们发现客户对部署机器学习模型的兴趣远远超过了对更传统的流处理数据算法的需求。随着对 MLOps 的日益关注,Rust 变得更合适。与 Pony 一样,它也为我们提供了安全性和性能,但更大的库生态系统对我们的 MLOps 工作至关重要。
当我们开始关注 MLOps 时,情况已经发生了变化。一方面,Rust 在短时间内取得了很大的进步。例如,对于并发运行时,我们现在有 Tokio[5]。另一方面,Rust 有强大的库生态系统。Pony 也在进步,但社区规模较小,作为一家小型初创公司,我们最好不必解决核心领域之外的问题,尤其是低级集成方面的问题。在 Rust 的 ML 方面有很多发展,自从进入这个领域以来,这对我们来说是最有价值的。
我们通过一些实验开始过渡,以了解我们将如何使用 Rust 解决我们现有的一些问题。我们的第一个实验之一是重写一个为客户构建的专用 HTTP 服务器。这使我们能够测试语言的体验。来自 Pony 的爱好者,对了解 Rust 的异步编程特别感兴趣。
对这项早期工作的结果感到满意,工程团队开始深入学习 Rust 并围绕其范式构建我们的平台。来自 Pony 的我们已经习惯于仔细考虑内存安全,所以我们已经准备好处理 Rust 的借用检查器,这对许多新的 Rustaceans 来说可能是一个艰巨的挑战。
使用 Rust 一段时间后,我们对结果非常满意。作为像 Pony 一样类型安全的语言,有一些重要的优势。我们可以快速推进我们的代码库,知道编译器会在它们成为运行时问题之前捕获一整类错误。借用检查器使我们免于花费数小时或数天的时间来寻找数据竞争。
我们新的基于 Rust 的平台最近每秒处理数百万次推理复杂的广告定位模型,平均延迟为 5 毫秒,每年的基础设施成本为 13 万美元。从客户的角度来看,这是一个巨大的成功。
更重要的是,我们希望访问更大的库生态系统的愿望得到了满足。我们目前正在使用 TensorFlow 和 ONNX 等开源库来运行 ML 模型。这些库使用 Rust 的 FFI 来包装底层的 C 实现。如果我们自己编写这些系统的基本包装器,我们就需要数周的开发时间,并且需要数月的时间才能使它们达到我们可以放心地将它们发送给客户的健壮状态。如果我们需要使用它们,我们可以使用大量其他库。这使我们能够专注于提供平台的业务目标,该平台使在生产中快速部署和运行机器学习模型变得简单。
除了丰富的可用库之外,我们还受益于 Rust 的成熟度和高采用率。我们知道正在构建一个设计良好且经过良好测试的语言,并且我们可以访问一个大型社区,这将保证未来的持续支持。这让我们能够将所有的工程精力集中在帮助客户解决他们的问题上。社区创建了各种各样的工具,包括 IDE、替代编译器、分析工具和新的目标平台。所有这些工具都使开发高质量软件变得更加容易。
我们已经调整了我们的入职流程,包括阅读 “The Rust Programming Language”、“The Rustonomicon”和关于 Rust 异步运行时的文章。尽管 Rust 的使用比 Pony 更广泛,但仍有很多优秀的程序员还没有学会它,所以我们希望确保我们有一种方法让他们在入门过程中跟上进度。
我们很高兴有机会与 Pony 结合。它是一种伟大的语言,帮助我们达到了今天的水平。我们鼓励任何对新编程思想感兴趣的读者花一些时间阅读本文,因为我们认为即使你从未在生产中使用它,你也会学到一两件事。我们的工程价值观之一[6]是“适合工作的工具”,在这个阶段,Rust 是满足我们需要的工具。我们对使用它感到兴奋,并正在迅速增强和改进我们的产品。
原文链接:https://www.wallaroo.ai/blog-posts/wallaroo-move-to-rust
Pony: https://ponylang.io/
[2]Rust: https://www.rust-lang.org/
[3]非易事: https://blog.wallaroolabs.com/2018/02/how-we-built-wallaroo-to-process-millions-of-messages/sec-with-microsecond-latencies/
[4]可预测的尾部延迟: https://blog.wallaroolabs.com/2018/03/performance-testing-a-low-latency-stream-processing-system/
[5]Tokio: https://github.com/tokio-rs/tokio
[6]工程价值观之一: https://www.wallaroo.ai/engineering-values
推荐阅读
觉得不错,点个赞吧
扫码关注「Rust编程指北」