宣布在 Rust 中推出 Amazon S3 传输管理器的开发者预览版

作者: 瓦卡尔·艾哈迈德·汗 |

我们很高兴地宣布推出适用于 Rust 的 Amazon S3 传输管理器的开发者预览版,这是一款高级工具,可通过 Amazon Simple Storage Service(Amazon S3)加快和简化上传和下载。使用这个新库,开发者可以在 Amazon S3 和各种来源(包括文件、内存缓冲区、内存流和目录)之间高效地传输数据。Transfer Manager 可自动处理复杂场景,例如并行分段上传和字节范围下载,以提供更高的吞吐量和可靠性。

主要特点和优点

  • 自动请求拆分:通过自动将大型请求拆分为部分大小的区块并在多个连接之间并行处理来提高吞吐量。这克服了单连接带宽限制。
  • 自动重试:通过自动独立重试失败的区块来增强可靠性,从而无需在发生间歇性错误时重新启动整个传输。
  • 优化的并行读取:在上传期间对大文件的不同部分实施并行读取操作,与顺序读取相比,提供卓越的性能。
  • 简化目录操作:通过单个 API 调用传输共享通用前缀的整个目录或对象,从而简化批量传输操作。
  • 高级负载平衡:根据当前工作负载和网络带宽动态调整并行度,自动优化吞吐量。

入门

要开始使用传输管理器,请遵循以下示例:

添加项目依赖关系

首先,你需要在 Cargo.toml 文件中添加一个新的依赖关系。

aws-sdk-s3-transfer-manager = "0.1.1"
Rust

创建传输管理器

使用默认推荐设置创建传输管理器:

let config = aws_sdk_s3_transfer_manager::from_env()
    .load()
    .await;
let transfer_manager = aws_sdk_s3_transfer_manager::Client::new(config);
Rust

上传文件示例

这将通过自动将请求拆分为部分大小的块并并行上传来上传文件。

`// Upload a single file to S3`
let bucket = "<BUCKET-NAME>";
let key = "<OBJECT-KEY>";
let file_to_upload = "<OBJECT-PATH>";

let stream = InputStream::from_path(file_to_upload)?;
let response = transfer_manager
    .upload()
    .bucket(bucket)
    .key(key)
    .body(stream)
    .initiate()?
    .join()
    .await;
Rust

下载文件示例

这会将下载内容拆分为部分大小的块,并行下载,然后按顺序交付。

// Download a single object from S3
let bucket = "<BUCKET-NAME>";
let key = "<OBJECT-KEY>";

let mut handle = transfer_manager
    .download()
    .bucket(bucket)
    .key(key)
    .initiate()?;

while let Some(chunk_result) = handle
    .body_mut()
    .next()
    .await {
    let chunk = chunk_result?.data.into_bytes();
    println!("Received {} bytes", chunk.len());
}
Rust

上传目录示例

这将递归上传目录中的所有文件,将给定的文件 key_prefix 与文件系统中每个文件的路径相结合。例如,如果你的 key_prefix 是"前缀",文件的路径是"test/docs/key.json",则文件上传时将使用"前缀/test/docs/key.json"的对象密钥。

// Upload a directory to S3
let bucket = "<BUCKET-NAME>";
let source_dir = "<SOURCE-DIRECTORY-PATH>";
let key_prefix = "<KEY-PREFIX>";

let handle = transfer_manager
    .upload_objects()
    .key_prefix(key_prefix)
    .bucket(bucket)
    .source(source_dir)
    .recursive(true)
    .send()
    .await?;

let response = handle.join().await?;
Rust

下载目录示例

这将下载前缀下的每个对象,并将创建一个具有相似层次结构的本地目录。

// Download objects with a common prefix to a local directory
let bucket = "<BUCKET-NAME>";
let destination_dir = "<DESTINATION-DIRECTORY-PATH>";
let key_prefix = "<KEY-PREFIX>";

let handle = transfer_manager
    .download_objects()
    .key_prefix(key_prefix)
    .bucket(bucket)
    .destination(destination_dir)
    .send()
    .await?;

let response = handle.join().await?;
Rust

结论

适用于 Rust 的 Amazon S3 Transfer Manager 通过高效的资源管理和易于使用的 API 来简化 Amazon S3 的操作。我们邀请您试用开发者预览版并通过 GitHub 问题分享您的反馈。您的意见将有助于塑造该库的未来发展,以满足 Rust 社区的需求。

作者简介:

瓦卡尔·艾哈迈德·汗

瓦卡尔·艾哈迈德·汗

Waqar 是亚马逊云科技通用运行时团队的软件开发工程师。你可以在 GitHub @waahm7 上找到他。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。