Talent-Plan:用 Rust 实现简易 KV 引擎

供稿:hz-xin.com     日期:2025-01-12
Rust 学习

过关过程:Rust Project 1: The Rust toolbox

代码参考:该 commit

完成过程:参照 README,本 project 过关过程比较 straightforward,主要工作包括:引入所有新增文件文件名作为模块名引入并使用 pub use 导出 bin 包会用到的结构。

包结构:对于 crate 包,lib 包中引用文件名,使用 pub use 导出 bin 包所需结构,bin 包通过 crate::方式引入 lib 包导出结构。

结果捕捉:满足题意要求,main 函数中实现了结果捕捉。

结构体:KvStore 结构体包含各变量意义。

写流程:使用 serde_json 序列化 set 命令,写入 current_writer,维护 key 索引,插入旧 value 时维护 useless_size,达到阈值时 compact。

读流程:获取 key 索引,不存在返回错误,存在则根据索引读取对应 reader,seek 到 offset 读取数据。

删除流程:获取索引,不存在返回错误,移除索引,序列化 rm 命令,写入 current_writer,增加 useless_size,达到阈值时 compact。

重启流程:初始化关键结构,调用 recover 函数维护 index 和 current_readers,构建当前最大文件 writer,根据 useless 判断 compact,返回。

Rust Project 2: Log-structured file I/O

错误处理:采用自定义错误结构 KVStoreError 和 failure crate,捕获错误并列举表示,使用 ? 传递错误。

包结构:lib 包引用文件名作为模块名,使用 pub use 导出结构,bin 包通过 crate::方式引入。

错误处理:使用 ? 传递错误,定义 Result 类型别名统一返回类型。

结果捕捉:实现结果捕捉。

Rust Project 3: Synchronous client-server networking

代码参考:该 commit

命令行解析:客户端和服务器分别解析命令行,客户端继承项目2,增加 addr 解析,错误输出到 stderr,非 0 值结束。

日志打印:使用 env_logger,启动时指定日志级别。

命令传输:使用 tcp 网络接口,处理黏包,使用 BufWriter 和 Deserializer 解决。

性能测试:创建性能测试文件,参照 criterion 手册,测试写延时和读延时。

Rust Project 4: Concurrency and parallelism

代码参考:该 commit

线程池:实现 NaiveThreadPool,使用 channel 实现共享队列,RayonThreadPool 使用 Rayon 官网示例。

多线程服务端:使用线程池管理 tcp 连接读写,维护 is_stop 原子变量避免阻塞。

KvsEngine 线程安全:KvsEngine 需要 Clone + Send + 'static,移除 &mut。

写流程:串行化 set 请求。

删除流程:串行化 remove 请求。

读流程:在 DashMap 中获取索引,读取对应 reader,创建 reader 避免 hash。

合并流程:使用多线程共享的原子变量清理过时文件和 reader。

性能测试:编写六个 benchmark,测试结果如下。

总结:本 Rust Lab 完成约 2000+ 行代码,涵盖了 Rust 项目开发的各个方面,下一步计划深入学习 Rust。使用 Zhihu On VSCode 创作发布。