2 个不稳定版本

使用旧的 Rust 2015

0.2.0 2018年11月12日
0.1.0 2018年11月11日

文件系统 中排名 #1294

每月下载量 40

Apache-2.0 协议

42KB
899

Depot

Crates.io Crates.io Travis

概述

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]

无运行时依赖