当前位置: 首页 > news >正文

【Rust日报】用 Rust 重写的 Turso 是一个更好的 SQLite 吗?

采访 Glauber Costa:用 Rust 重写的 Turso 是一个更好的 SQLite 吗?

Linux 内核贡献(3:16-15:17):Glauber Costa 从 2003/2004 年开始,为 Linux 内核贡献了 10 年时间。他讲述了自己最初对开源的着迷,以及为内核做贡献所面临的挑战,包括有时严苛的社区环境。他参与了虚拟化、容器、内存管理和网络等多个方面的工作,对操作系统有了深刻的理解。

转型至创业公司和数据库(15:17-26:23):在红帽公司和 Linux 内核项目工作之后,格劳伯于 2013 年加入了一家创业公司,该公司最初专注于一个名为 OSv 的“单内核”项目。该项目最终失败,但公司转型成为一家数据库公司,名为 ScyllaDB,它是对 Apache Cassandra 的高性能重写版本。这标志着格劳伯正式进入数据库领域,并在该领域工作了近十年。

从 Scylla 的经验教训和生态系统兼容性的力量(26:23-30:11):Glauber 强调,Scylla 的成功源于其与 Cassandra 的完全兼容性,以及对现有生态系统重要性的深刻理解,而非试图取代一切。这一经验教训深刻影响了他对 Turso 的开发理念。他还探讨了积极验证市场想法并在必要时快速调整方向的重要性。

Turso 的起源及 SQLite 的局限性(30:11-37:41):Glauber 和他的联合创始人 Pekka 最初创办了一家名为 Chisel Strike 的公司,旨在将 SQLite 与 TypeScript 运行时相结合,实现边缘数据持久化。但这个想法最终失败了。之后,他们转向创建 SQLite 的一个分支,并在此基础上构建了一个名为 Turso Cloud(现更名为 Turso)的云服务。虽然这项业务取得了成功,但他们也意识到这个分支存在一些局限性。

为什么重写 SQLite 能吸引贡献者 (37:41-48:04):Turso 的核心动机在于它完全重写了 SQLite,而 SQLite 的“开源但不开放贡献”模式正是其核心动机所在 (37:41)。SQLite 的核心团队规模很小,不像 Linux 内核等项目那样开放外部贡献。Glauber 指出,这种限制阻碍了 SQLite 发展,使其无法支持多写入器等用户普遍需要的功能。尽管 Turso 仍处于 alpha 测试阶段,但其重写版本在不到一个月的时间内就获得了社区的极大关注,GitHub 上获得了 9000 个 star 和 60 位贡献者,这表明用户对可扩展的嵌入式数据库有着迫切的需求。

观看:https://youtu.be/1JHOY0zqNBY

播客:对话 Rust for Linux 维护者 Danilo Krummrich

Danilo Krummrich 是 Red Hat 的一名软件工程师,也是 Rust for Linux 项目的核心贡献者。他对 Rust for Linux 的主要贡献在于驱动程序核心架构,这是使用 Rust 编写驱动程序的基础框架。这包括为内核中的设备驱动程序提供核心抽象的 C 和 Rust 代码。Danilo 维护着多个关键的内核子系统,包括驱动程序核心、DRM(GPUVM、Rust、GPU 调度器)、NVIDIA GPU 的 GPU 驱动程序(Nova、Nouveau)、固件加载器 API,以及 PCI、DMA 和 ALLOC 的 Rust 绑定。他是 Nova GPU 驱动程序的主要开发者,该驱动程序完全基于 Rust,适用于现代 NVIDIA GPU。

将 Rust 引入 Linux 内核是开源历史上最雄心勃勃的现代化举措之一。Linux 内核拥有数十年的 C 代码和根深蒂固的开发实践,如今正向一种内存安全的语言敞开大门。这是 30 多年来首次有新的编程语言被正式采纳用于内核开发。但这条路远非一帆风顺。

在本期节目中,我们采访了 Linux 内核维护者兼 Rust for Linux 核心团队成员 Danilo Krummrich,探讨了将 Rust 集成到 Linux 内核中的开创性工作。我们重点讨论了 Nova GPU 驱动程序(基于 Rust 的 NVIDIA 显卡驱动程序 Nouveau 的继任者),以及在内核中大规模采用 Rust 所需的技术挑战和文化转变,并展望了 Rust4Linux 项目的未来。

这些挑战和经验包括:

  • 他们不得不编写自己的分配器抽象(kbox、kvec、kvbox),因为 Rust 的 alloc crate 不支持内核特定的要求,例如分配标志和 NUMA 节点。

  • 类型状态在编译时对硬件状态进行编码——在 C 语言中,你会得到一个指向设备的原始指针,你需要自行决定如何正确使用它。而在 Rust 中,设备具有类型状态(例如“Core”),这些状态只暴露在该状态下有效的函数。例如,总线回调会获取一个具有 Core 类型状态的设备,因为此时会持有全局总线锁,从而允许调用修改设备字段的函数。在这些回调之外,你无法获取到这种类型状态,因此这些函数实际上并不存在于你的设备引用中。

  • 内核中充满了自引用代码(链表、锁)。Benno Lossin 创建了 pin-init 用于原地初始化和绑定,现在它也作为用户空间 crate 提供。在内核代码中,移动元素通常是不现实的。

  • 引用计数封装了 C 语言的 kref 模式——内核结构体嵌入了一个 struct kref(一个带有释放回调的原子计数器)。Rust 的抽象使用了 AlwaysRefCounted trait 和 ARef。作为包装类型。特性边界允许你在任何引用计数内核结构上编写通用代码,而 C 端则继续执行其自身的操作。

  • 抽象才是难点,驱动程序相对容易。用 Rust 安全地封装 C 内核 API 非常困难。即使是经验丰富的内核开发者,即使他们了解 Rust,也会在这个转换层上遇到困难。但是,一旦抽象实现,驱动程序的开发就变得可行了。

收听:https://corrode.dev/podcast/s05e06-rust4linux/

讨论:https://www.reddit.com/r/rust/comments/1pk1qpz/rust_in_the_linux_kernel_type_states_custom/

教程《针对初学者的嵌入式 Rust 入门指南》

这篇文章为想要踏入嵌入式 Rust 开发领域的初学者提供了一份详尽的入门指南。作者根据自身经验,从硬件选型、前置知识到具体的学习资源提供了清晰的路线图。

1. 前置准备

  • Rust 语言基础:在开始之前,必须掌握 Rust 的所有权(ownership)、借用(borrowing)和类型系统。建议先阅读官方的Rust Book

  • 电子学基础:需要了解电压、电流、电阻以及 LED、电阻器等基本元件的工作原理。

2. 硬件推荐作者强烈建议通过购买开发板来开始学习,而不是只看书。

  • 首选推荐:ESP32 DevKit V1

    • 理由:性价比极高,集成了 WiFi 和蓝牙,无需额外的调试探针(Debug Probe)即可轻松烧录代码,且拥有成熟的 Rust 生态支持(esp-rs)。

  • 其他选择

    • Raspberry Pi Pico 2:适合学习基础,但若想获得流畅的调试体验,成本会因为需要购买调试探针而增加。

    • BBC micro:bit v2:虽然板载功能丰富(LED 矩阵、麦克风等),但价格较贵且连接外部传感器不够方便。

3. 学习资源与路径作者整理了多个开源书籍和教程,涵盖了从通用概念到特定硬件的学习:

  • 通用基础

    • 《The Embedded Rust Book》:官方嵌入式 Rust 书籍,必读入门。

    • 《Embassy Book》:学习嵌入式 Rust 中现代的async(异步)编程框架。

  • 针对 ESP32

    • 《The Rust on ESP Book》:Espressif 官方文档,介绍环境搭建和生态系统。

    • 《impl Rust for ESP32》:作者编写的开源书,通过 ESP32 实践点亮 LED、读取传感器、WiFi 控制等项目。

  • 针对 Pico 和 micro:bit

    • 作者同样编写了对应的实战书籍《Pico Pico Book》《impl Rust for Microbit》

  • 进阶资源

    • 《Rust Embedded Driver (RED) Book》:教你如何从零开始为传感器编写 Rust 驱动程序。

    • Wokwi:一个在线电路模拟器,支持在浏览器中运行嵌入式 Rust 代码,无需硬件即可练手。

讨论:在面对大型 Rust 代码库时应如何入手阅读和理解

社区给出的核心建议:

  1. 利用工具生成文档 (Top Priority)

  • **cargo doc**:这是最高频的建议。运行cargo doc --no-deps --open可以为当前项目生成本地 HTML 文档。

  • 作用:这能让你跳过具体的实现细节(函数体内部的代码),直接查看高层级的 API、结构体定义、模块关系和注释,就像阅读库的使用手册一样。

  1. 找准入口点 (Entry Points)

  • **src/main.rs**:如果是二进制程序(binary),从这里开始,看程序是如何启动和初始化的。

  • **src/lib.rs**:如果是库(library),这里通常定义了对外暴露的模块和 API。

  • 关注架构:先弄清楚项目的“骨架”。看它如何将各个模块(crates)串联起来。

  1. 阅读策略

  • **略读 (Skimming)**:不要试图一行一行读。先像看书的目录一样快速浏览所有文件和代码,建立一个模糊的整体印象(mental map),这有助于后续将细节归位。

  • 模式识别:经验丰富的开发者依靠“模式”来阅读。大型项目通常会将代码拆分为隔离的模块(有人提到了六边形架构 Hexagonal Architecture)。理解了架构模式,就能知道去哪里找具体的逻辑。

  1. 实践出真知

  • 写比读更重要:有评论指出,阅读大型代码库的能力往往来自于编写大型代码库的经验。当你自己尝试过构建复杂的系统,自然就能识别出别人代码中的常见结构和设计意图。

Reddit:https://www.reddit.com/r/rust/comments/1pkq1l0/how_do_rust_devs_read_large_codebases/

--

From 日报小组 苦瓜小仔

社区学习交流平台订阅:

  • Rustcc论坛: 支持rss

  • 微信公众号:Rust语言中文社区

http://www.jsqmd.com/news/97743/

相关文章:

  • 咸鱼流出上千元洋垃圾顶配十代i7笔记本电脑,仅830g,自带13.3寸全高清IPS夏普,还带全功能Type-C接口!
  • 树莓派平台theHarvester开源情报收集系统部署指南
  • MNN智能模型部署全攻略:多版本并行与动态调度实战
  • POCO分布式锁深度调优:如何通过智能缓存减少80%的Redis网络开销
  • MFC CEdit 屏蔽右健菜单
  • 智能体间的“沉默成本”:当 A2A 通信成为系统瓶颈
  • Go 语言的“反模式”清单:来自资深 Gopher 血泪教训的 10 条“不要做”
  • C++ 基础语法
  • BilibiliSponsorBlock完整教程:一键跳过B站广告实现纯净观看
  • 被困在算法里的不只是外卖骑手,还有广大自媒体人
  • 新项目为什么更推荐WebFlux,而非SpringMVC?
  • 基于Java springboot教培机构在线教育平台系统教学资源课程学习作业布置提交批改(源码+文档+运行视频+讲解视频)
  • 利用DeepSeek提取Javascript代码实现命令行求解方块完全覆盖问题
  • 解密Khoj项目:如何构建坚不可摧的用户身份安全防线
  • 出了一些成绩
  • 终极指南:5步掌握llama.cpp量化技术,让大模型内存占用直降70%
  • 基于Java SpringBoot书店图书借阅系统图书归还逾期罚款(源码+文档+运行视频+讲解视频)
  • PostgreSQL pg_clickhouse插件的安装和使用
  • 真实环境中态、势、感、知的链式反应
  • 18、KDE桌面环境个性化设置全攻略
  • 终极指南:如何用LSUnusedResources快速清理iOS项目中未使用的图片资源
  • 12、词法分析与语法分析工具使用指南
  • 云数据库备份恢复验证,云数据库高端客户的需求说明
  • 加州大学著名计算机科学家称人工智能“研究”论文完全是垃圾
  • 阿里云百炼大模型---凭此号7.5折---你这脸够大,还行8寸的
  • MoveIt2机器人运动规划实战:从配置到高级应用的完整指南
  • 41、系统日常管理与维护实用技巧
  • ReClassEx终极指南:掌握专业级内存逆向分析
  • 《Python × 数据库:用 SQLAlchemy 解锁高效 ORM 编程的艺术》
  • Cartographer时间同步完整指南:5大关键技术突破多传感器融合瓶颈