2 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2018年11月12日 |
---|---|
0.1.0 | 2018年11月11日 |
在 文件系统 中排名 #1294
每月下载量 40 次
42KB
899 行
Depot
概述
Depot 是一个持久队列库。您可以在磁盘上存储项目,以后可以按顺序检索它们。项目是一组字节(u8
)的集合,并分配一个单调递增的 ID。ID 不一定是连续的。
需要注意的是,Depot 严格关注底层存储。复制和远程访问不在 Depot 的范围内。
状态
Depot 目前正在开发中,但应在几周内“完成”。开发发生在周六和周日下午,CDT。
使用方法
extern crate depot;
use depot::Queue;
fn main() {
// Create a queue that writes data into /tmp/my-queue (a directory)
let mut queue = Queue::new("/tmp/my-queue");
// Append an item
let message = format!("the quick brown fox jumped over the lazy dog");
let data = message.as_bytes();
queue.append(&data).unwrap();
queue.sync().unwrap();
// Read all of the items and print them
let mut stream = queue.stream(None).unwrap();
while let Some(item) = stream.next() {
println!("read item: {:?}", item.unwrap());
}
}
目标 & 思考
- 在磁盘上以紧密控制数据何时刷新的方式存储数据。
- 容忍崩溃和断电,但以懒惰的方式处理。
- 单线程写入器。
- 支持以原子方式重写队列部分的能力。这对于实现压缩等概念很有用。
- 支持从多种语言中使用,特别是 Rust 和 JVM。
- 同步文件 I/O。鉴于 Linux 上 AIO 的糟糕状态,依赖于高级抽象来模拟异步行为。例如,可以使用专门的线程组与 Depot 交互。
- 网络支持留给了高级库。
- 可能支持数据完整性措施。每个项目的 CRC 正在考虑中,以牺牲每个存储项目 4 字节额外的固定开销。
常见问题解答 (FAQ)
Depot 如何存储数据?开销是多少?
Depot 使用二进制编码在普通文件中存储其数据。一种逃生机制处理记录分隔符和失败字节的冲突。
在 Depot 中存储的每个记录都花费一个常量字节的开销,加上编码机制的 ~2% 开销。在最坏的情况下,如果项目中的所有字节都需要转义,则项目可能需要 100% 的存储空间。通常,如果实现中添加了 CRC 机制,则可能会增加每个项目 4 字节。此外,由于断电或崩溃而可能发生的截断项目,在恢复过程中会额外增加两个字节。
Depot 如何处理写入数据时的崩溃?
当打开队列以追加时,它读取文件的最后一个字节。如果是 10,则假设系统没有崩溃。
但是,如果它不是 10(并且文件不为空),Depot 假设之前的写入者已崩溃,并追加两个 45 值,然后是 10。API 允许读取者区分已完全写入的项目和可能只部分写入的项目。请注意,这些值不可能出现在项目的编码有效负载中,因为它们通过转义/控制字节机制转换为其他值。
Depot 的速度有多快?
低级原语Section主要受限于磁盘I/O速度。在一个非常初步的测试中,使用一台联想Thinkpad,i7-6600U,配备消费级固态硬盘,50字节的数据包,单个读取器可以完成约4.7M次读取/秒。这相当于约300MB/秒。对于写入器,在相同限制下,大约1.7M次写入/秒,相当于约110MB/秒。请谨慎看待这些测量结果。
主要接口Queue具有类似的性能特征,但尚未进行测量。
由于其仅追加的设计,它也应该在“旋转磁存储”磁盘上表现良好。
Depot支持多个并发写入者吗?
不支持多个并发写入者。如果需要进程间协调,可以使用如semalock这样的库,但如果可能的话,最好使用消息和单个写入者。
Depot支持删除记录吗?
从概念上讲,是的,但这尚未实现。鉴于队列被分割成包含有限数量项的文件,每个这样的文件都可以被重写,然后原子性地重命名覆盖旧部分。在Linux上,可能还持有旧文件描述符的读取器将继续工作,直到它们释放文件描述符。
Depot可以存储多少数据?
理论上,单个Depot队列可以存储约3.8PB的数据,前提是有1.9B个文件,每个文件大约2GB。这是因为Depot使用64位偏移量来有效地从队列中的位置恢复。32位用于文件地址,32位用于文件中的位置。您可能会在达到这个限制之前遇到底层存储限制,无论是硬件(磁盘大小)还是软件(文件系统)。尽管如此,还没有测试过接近这个数值的数据。
Java和Scala?
计划通过JNI支持,请参阅jvm目录,该目录正在努力实现从Java和Scala代码使用Depot的概念证明。
许可证
Depot采用Apache许可证,版本2。请参阅LICENSE。
作者
Jason Longshore [email protected]