#s3 #aws-s3 #response-headers #etag #etags #conditional-fetch

conditional-s3-fetch

解析并条件性从 S3 拉取更新的文件结构,使用 etags

1 个不稳定版本

0.1.0 2024年2月6日

#9#etag

MIT/Apache

30KB
260

conditional-s3-fetch

文件容器结构,用于获取和解析 S3 文件,具有条件获取功能。


通常,您需要在生命周期较长的进程中实现后台文件获取器。为了避免不必要的获取,您可以使用 conditional-s3-fetch 包只在文件被修改时从 S3 获取文件。

它将使用带有提供的 AWS S3 ETag 响应头部的 If-None-Match 头部,以避免在文件未被修改时获取和解析文件。此包提供了一个 File 结构,它将元数据添加到解析内容中,以便在未来的获取调用中重用。

安装

将以下内容添加到您的 Cargo.toml 文件中

[dependencies]
conditional-s3-fetch = "0.1.0"

提供的文件解析类型包括

此包提供的其他无模式文件格式解析

  • simd-json(默认)或 json:提供 Json 解析器,帮助将文件读入结构。
  • cbor(默认):提供 Cbor 解析器,帮助将文件读入结构。

您可以通过禁用默认功能并启用所需功能来自定义提供哪些内置的附加解析器。

[dependencies]
conditional-s3-fetch = { version = "0.1.0", default-features = false, features = ["json"] }

示例

您可以从一个空的 File::unloaded 实例开始,稍后使用 fetch 方法获取它,例如在后台进程循环中。

use conditional_s3_fetch::File;;

let mut file = File::<String>::unloaded("my-bucket", "/my/path.txt");

for x in 1..10 {
    match file.fetch(&s3_client).await {
        Ok(Some(new)) => file = new,
        Ok(None) => println!("No modification"),
        Err(e) => eprintln!("Error: {}", e),
    }
    println!("Scheduling another update soon");
    sleep(Duration::from_secs(10)).await;
}

添加共享可变访问,如 Arc,留作每个项目根据其需求自行解决。

实现自定义解析器

您可以通过实现带有自定义解析逻辑的 Parse 特性来自定义解析器。然后可以使用 File::<MyParser> 疾驰鱼语法调用它。

use conditional_s3_fetch::{File, Parse, BoxedResult};

struct MyParser;

impl Parse for MyParser {
    type Output = String;

    fn parse(data: bytes::Bytes) -> BoxedResult<Self::Output> {
        match data.as_ref() {
            b"hello" => Ok("world".to_string()),
            _ => Err("Invalid data".into()),
        }
    }
}

let file = File::<MyParser>::unloaded("my-bucket", "/my/path.txt");

本地开发

有一个示例二进制文件,可以用于在本地测试此包,使用本地的 minio 容器。

cd example
docker-compose up -d
cargo run --example watcher
docker-compose down

依赖关系

~28MB
~461K SLoC