25个版本
0.3.14 | 2023年6月20日 |
---|---|
0.3.8 | 2023年5月29日 |
0.3.5 | 2023年3月30日 |
0.2.7 | 2022年12月30日 |
0.1.0 | 2022年7月26日 |
#15 in #byte-vector
145 每月下载次数
125KB
2.5K SLoC
blobnet
一个可配置的、低延迟的用于内容寻址数据的blob存储服务器。
有关更多信息,请参阅API 文档。
安装
cargo install blobnet # install server CLI / binary
cargo add blobnet # add to your project
作者
本库由Modal团队创建。
- Eric Zhang (@ekzhang1) – Modal
- Jonathon Belotti (@jonobelotti_IO) – Modal
lib.rs
:
Blobnet
一个可配置的、低延迟的用于内容寻址数据的blob存储服务器。
这充当一个非易失性的、通过网络的内容缓存。客户端可以将二进制blob(固定大小的字节数组)添加到缓存中,数据通过其SHA-256哈希值进行索引。给定哈希值和要读取的字节范围,可以检索任何blob。
存储在blobnet中的数据是本地缓存的且持久的。
提供者
blobnet的核心是Provider
trait。此trait定义了所有blobnet实例共享的接口。它被这样使用
use std::io::Cursor;
use blobnet::ReadStream;
use blobnet::provider::{self, Provider};
// Create a new provider.
let provider = provider::Memory::new();
// Insert data, returning its hash.
let data: ReadStream = Box::pin(b"hello blobnet world!" as &[u8]);
let hash = provider.put(data).await?;
// Check if a blob exists and return its size.
let size = provider.head(&hash).await?;
assert_eq!(size, 20);
// Read the content as a binary stream.
provider.get(&hash, None).await?;
provider.get(&hash, Some((0, 10))).await?; // Requests the first 10 bytes.
您可以以任何顺序组合这些操作,并且它们可以并行运行,因为它们使用共享的&self
接收器。每个操作的语义应独立于提供者而保持一致。
Provider
trait是公开的,并提供了一些提供者,支持在本地目录、网络文件系统或AWS S3中存储。
网络服务器
Blobnet允许您将其作为服务器运行并通过网络发送数据。它通过HTTP/2协议响应blob操作。例如,您可以在本地机器上运行blobnet服务器:
export BLOBNET_SECRET=my-secret
blobnet --source localdir:/tmp/blobnet --port 7609
这指定了使用字符串语法为--source
标志指定的提供者。您可以将另一个进程中的服务器作为提供者连接到
use blobnet::{client::FileClient, provider};
let client = FileClient::new_http("https://127.0.0.1:7609", "my-secret");
let provider = provider::Remote::new(client);
为什么你想在网络中共享blobnet服务器?一个用例是用于共享缓存。
缓存
Blobnet支持使用Cached
提供者进行数据的两级缓存。这会将文件分割成可配置的页面大小的块,并将它们存储在本地缓存目录和内存页面缓存中。通过在非易失性存储中添加缓存,我们可以通过多个数量级加速文件操作,与网络文件系统相比,例如
use blobnet::provider;
// Create a new provider targeting a local NFS mount.
let provider = provider::LocalDir::new("/mnt/nfs");
/// Add a caching layer on top of the provider, with 2 MiB page size.
let provider = provider::Cached::new(provider, "/tmp/blobnet-cache", 1 << 21);
缓存对于访问远程blobnet服务器也非常有用。它很好地组合在一起,可以增加数据流中的更多层级,提高系统效率和网络负载。
use blobnet::{client::FileClient, provider};
// Create a new provider fetching content over the network.
let client = FileClient::new_http("https://127.0.0.1:7609", "my-secret");
let provider = provider::Remote::new(client);
/// Add a caching layer on top of the provider, with 2 MiB page size.
let provider = provider::Cached::new(provider, "/tmp/blobnet-cache", 1 << 21);
这些抽象一起允许您创建一个可配置的、非常低延迟的内容寻址存储系统。
依赖项
~68MB
~1.5M SLoC