---
title: Rust：构建新时代基础设施的首选语言
description: '本次分享聚焦于数据库和 AI 领域，从跨云数据访问和向量数据库的现实需求谈起，阐述为什么 Rust 是适合于新时代基础设施的编程语言，并分析 Rust 在新时代基础设施下的新机遇。'
slug: category-product/qcon-rust
tags: [Product, Engineering, Rust]
category: Product
cover_url: 'qcon-rust/cover.png'
image: 'qcon-rust/cover.png'
authors:
  - TCeason
---

以「启航 • AIGC 软件工程变革」为主题的 QCon 全球软件开发大会北京站于 9 月 5 日在北京富力万丽酒店圆满落幕！此次大会包含向量数据库、云原生、异构计算、面向 AI 的存储、微服务架构治理、FinOps 等近 **30 个**精彩专题。**Databend Labs 作为深耕云原生数据库领域的科技公司受邀参与。**

9 月 3 日下午，Databend 研发工程师 - 邰翀作为「构建未来软件的编程语言」专题的演讲嘉宾参与本次分享。

{/* truncate */}

![image.png](../static/img/blog/qcon-rust/tceason.jpg)

**主题：** 「Rust：构建新时代基础设施的首选语言」

**演讲嘉宾：** 邰翀

**嘉宾介绍：** Databend 研发工程师

本次分享聚焦于数据库和 AI 领域，从跨云数据访问和向量数据库的现实需求谈起，阐述为什么 Rust 是适合于新时代基础设施的编程语言，并分析 Rust 在新时代基础设施下的新机遇。本次分享主要分为四个部分：

- Rust 新时代基础设施的最佳选择
- All in Rust 为 Databend 带来了什么
- Rust 如何成为构建 Vector Embeddings 的关键语言
- Rust 的机遇与挑战

## Rust 新时代基础设施的最佳选择

在此前，当我们谈论基础设施时，首先可能会想到服务器、Oracle 等。而近些年来，我们谈论基础设施已经离不开云和构建在云上的各种服务。

**新时代基础设施是指**：可以在云上自由部署、与云完美融合的基础设施。在这个新时代中，Databend 和一些数据库同行都选择了 Rust 作为首选语言。我们可以观察到 amazom、微软、Firefox、飞书、TiKV、云数仓 Databend、OpenDAL 等公司或者项目在使用 Rust 。

![image.png](../static/img/blog/qcon-rust/1.png)

#### Rust 的发展时间线

- **2006 年，** Graydon Hoare 着手设计和实现 Rust 语言，此时，还只是他的个人项目。
- **2009 年**，Mozilla 开始赞助这个项目，并成立团队支持 Rust 的开发。
- **2010 年**，Rust 首次公开，并在一年后实现了编译器自举，到 2015 年发布了第一个稳定版本。
- **2021 年**，Rust 基金会成立，为 Rust 语言带来更广阔的发展前景。

#### Rust 与内存安全

Rust 的创始人 Graydon Hoare 曾经说过：“Rust 是一种采用过去的知识解决将来的问题的技术。”

在我的理解中，Rust 的主要目标之一就是解决内存安全问题。

**下面列出一些常见的内存安全问题：**

- **Out-Of-Bound** **：** 假设有两个线程，其中一个线程在访问链表，另一个线程在进行删除，这个时候可能会产生越界问题。
- **Use After Free** **：** 指针指向了堆上一块内存，但是这块内存因为扩容或者其他原因导致重分配，给了恶意代码修改并且执行被释放内存的机会。

#### 通用手法

针对内存安全问题，不同的编程语言都会提出自己的一套解决方案，目前通用的方式包括：

- **垃圾回收（Garbage Collection，GC）** ：设立专门的垃圾回收机制来检测内存。由于回收机制的时间不固定，这种方式可能会导致内存不可控。对于数据库软件而言，如果在做大量数据的聚合相加，可能会导致内存飙升，并且很长时间无法释放，容易诱发 OOM。

- **自动引用计数（Automatic Reference Counting，ARC）** ：可以自动地跟踪和管理对象的引用计数，从而避免了手动管理内存的繁琐和容易出错的问题，算是一种比较好的方式。

- **手动管理内存（Manualy Handle Memory）** ：开发者自行管理分配和释放，对程序开发功底要求比较高。

#### Rust 怎么做

上面的三种通用手法是通过管理引用来处理内存安全问题的，**而 Rust 则选择通过限制引用行为来解决内存安全问题。** 更具体地，Rust 引入了所有权、借用检查和生命周期这三个重要的概念。

- **所有权（Ownership）** ：每个值只能有一个所有者。

- **借用检查（Borrow Check）** ：帮助管理所有权的一套规则，能够处理内存分配和释放，防止数据竞争。

- **生命周期（Lifetimes）** ：程序中每个变量都有一个固定的作用域，当超出变量的作用域以后，变量就会被销毁。变量在作用域中从初始化到销毁的整个过程称之为生命周期。

#### Rust：最受程序员推崇的语音

正因为 Rust 语言表现力、卓越的性能以及自己独有一套的内存管理方式，蝉联八届 Stack Overflow Developer Survey 最受程序员推崇的语言。

![image.png](../static/img/blog/qcon-rust/2.png)

## All in Rust  为 Databend 带来了什么

Databend Labs 成立于 2021 年 3 月，是一家开源 Data Cloud 服务商，致力于为大数据生态提供坚实可靠的基础设施。我们的核心团队成员来自 ClickHouse 社区、谷歌 Anthos、阿里云等国内外知名互联网和云计算公司，团队在云原生数据库领域有着丰富的工程经验，同时也是数据库开源社区活跃贡献者。

#### 我们在用 Rust 做什么？

Databend 是一款使用 Rust 研发、开源、弹性、低成本，基于对象存储也可以做实时分析的新式数仓，具有即时扩缩容能力，能在数分钟内增加数百倍的算力，为企业提供了一个用于存储、管理和分析大量数据的集中式平台，从而助力企业更准确地洞察业务、制定战略。

![image.png](../static/img/blog/qcon-rust/3.png)

除了 Databend 之外，我们也使用 Rust 开发和维护了大量项目：

- **OpenRaft** 是在 tokio 之上实现的异步 Raft 框架，在 leadership 上做了大量优化，性能非常强劲。

- **BendSQL** 是基于 Databend HTTP API 和 Arrow Flight API 设计和实现的原生客户端。

- **AskBend** 是一款知识库智能问答系统，基于 OpenAI 的 API 并且利用 Databend 内置的一系列 SQL 函数（AI Functions）打造。访问链接：https://ask.databend.com 即可体验。

- **OpenDAL** 提供一个统一、简单、高效、可靠、可观察的数据访问层，让开发者可以无缝地使用不同的存储服务，并享受到最佳的用户体验。今年 3 月份的时候已经移交到 Apache 软件基金会孵化器中进行孵化。

#### Rust 给我们带来了什么？

数据库本身就是计算机科学皇冠上的一颗明珠，是一个庞大而又复杂的系统。而在 Databend 的设计和实现中，我们还从目前市场上最优秀的数仓中借鉴了一些经验。例如，我们参考了 Clickhouse 的向量化设计，以提高单机的性能。同时，我们也借鉴了 Snowflake 的集群优点，以增强分布式计算能力。

选择 Rust 作为这样一个复杂系统开发的首选语言，我们收获了这些：

- **高效** **的研发** **：** 虽然 Databend 从第一版发布至今**只有 2 年多**，但从开源到文章撰写时为止，已经累计有 **8000** 多个 PR。

- **优越** **的** **性能：** Databend 在 Clickbench 基准测试中，**数据导入性能排名第一**，并且在 c6a.4xlarge 机型性能登顶，除了优秀的设计和实现之外，Rust 功不可没。

- **活跃的** **社区：** 得益于 Rust 语言的流行和社区的持续关注，到文章撰写时为止已有超过 **200 位贡献者**，收获 **6.5 k star** ，是 Rust 社区中的明星项目之一。
- ![image.png](../static/img/blog/qcon-rust/4.png)

## Rust 如何成为构建 Vector Embeddings 的关键语言

同样是数据库领域，现在让我们将目光转向今年在 AI 上大放异彩的向量数据库。

向量嵌入（Vector Embeddings）可以将数据转化为一个包含其实际含义的向量空间。而向量数据库则致力于挖掘存储和处理向量数据的能力，并提供高效的向量检索功能。

#### 为什么需要向量数据库

对于 GPT 这样的大模型而言，Tokens 大小限制了应用的进一步开发，而引入向量数据库之后，就可以利用向量检索和向量索引能力，相似度更近的数据紧凑存放。这样可以带来两个方面的好处：

- 降低 GPT 的使用成本。
- 维护长期记忆，帮助 AI 理解和执行复杂任务。

#### Rust 如何进入向量数据库

让我们一起来看一下 Rust 是怎么进入到向量数据库领域的：

- **研发新的向量数据库：** 获得知名投资机构 YC 的青睐的 LanceDB  使用 Rust 设计了针对向量数据库的存储格式。

- **重写现有向量数据库：** Pinecone 将 C++ 和 Python 代码库使用 Rust 完全重写。在今年 5 月份获得 a16z 一亿美元 B 轮投资。

- **拓展旧有向量数据库：** Milvus 则计划引入 OpenDAL（Rust 开发的存储访问层）的 C++ binding，以支持跨多云数据存储能力。

- **拓展现有其他数据库：** Databend 支持向量类型的存取与基本相似度查询功能，并且提供 AI Functions，能够与 OpenAI API 进行交互。

- **拓展旧有其他数据库：** AI 初创公司 tensorchord 使用 Rust 开发 PostgreSQL 的向量处理拓展 pgvecto.rs。

## Rust 的机遇与挑战

回顾 Databend Labs 使用 Rust 的研发历程，并且结合业界其他公司的经验，我们认为，Rust 能够成为构建新时代基础设施的首选语言的主要因素有以下几点：

- 内存安全
- 性能保障
- 敏捷开发

#### 机遇

Rust 在新时代中的机遇，其实可以和前面 Rust 如何进入向量数据库结合起来看，这里同样举几个典型的项目作为例子。

- **新项目服务旧场景：**
- - Polars 是 Pandas 的有力竞争者，团队宣布种子轮收获 400 万美元融资，用于打造 OLAP 计算平台。
  - HuggingFace 开源新的深度学习框架 Candle，使用 Rust 编写。

- **新项目服务新场景**
- - llmchain-rs 针对大模型工具链提供一站式解决方案。
  - mosec 针对大模型部署和服务开发提供高性能解决方案。

#### 挑战

- 程序的可靠性仍然需要开发者自己去管理，并不能因为使用 Rust 就掉以轻心。一个有意思的段子是“声称内存安全的项目中，往往充斥着大量的 unsafe 代码”。

- 尽管生态已经日趋完善，但在实际开发过程中，仍然少不了造轮子。而对于非系统编程，或者原型快速开发阶段，使用 Rust 在开发工具和生态对接上相比 Java、Python 等语言还存在一些问题。

- 由于 Rust 本身的复杂性，新手仍然需要迈过门槛，而且 Rust 语言进入到项目以后在编译时间、CI 流水线等方面都需要进行不同程度的调试与改造。
