49个版本 (18个破坏性更新)

0.19.0-alpha.32022年6月10日
0.18.2 2022年6月7日
0.12.4 2022年2月8日
0.11.0 2021年12月24日
0.10.2 2021年10月22日

#24 in #file-access

Download history 4/week @ 2024-06-03 3/week @ 2024-06-10

每月147次 下载
用于 2 crates

Apache-2.0/MIT

655KB
16K SLoC

Condow

Condow是一个并发下载器,通过将下载分为多个部分并发下载BLOB。

一些服务/技术/后端可以通过“打开多个连接”来并发下载BLOB,从而提高下载速度。例如AWS S3。

此crate仅提供核心功能。要实际使用,请使用实现crate之一

  • condow_rusoto:通过rusoto-s3 crate使用AWS S3
  • condow_fs:使用tokio进行异步文件访问

要添加更多“服务”,只需实现CondowClient trait。

许可证

condow根据MIT许可证和Apache许可证(版本2.0)的条款分发。

有关详细信息,请参阅LICENSE-APACHE和LICENSE-MIT。

许可证:Apache-2.0/MIT


lib.rs:

ConDow

概述

ConDow是一个并发下载器,通过将下载分为多个部分并发下载BLOB。

一些服务/技术/后端可以通过“打开多个连接”来并发下载BLOB,从而提高下载速度。例如AWS S3。

此crate仅提供核心功能。要实际使用,请使用实现crate之一

要添加更多“服务”,只需实现[CondowClient] trait。

使用方法

要使用condow,需要一个访问远程数据的客户端。在下面的示例中,使用InMemoryClient。通常,这将是某些客户端,它实际上访问远程BLOB。

本身可以使用[Condow] struct下载BLOB。由于它有两个类型参数,可能不方便传递它。考虑使用[Downloads] trait(它只有一个关联类型)或[DownloadUntyped] trait(它是对象安全的)来传递[Condow]的实例。

use condow_core::condow_client::InMemoryClient;
use condow_core::{Condow, config::Config};

// First we need a client...
let client = InMemoryClient::<String>::new_static(b"a remote BLOB");

// ... and a configuration for Condow
let config = Config::default();

let condow = Condow::new(client, config).unwrap();

assert_eq!(condow.get_size("a location").await.unwrap(), 13);

// Download the complete BLOB
let blob = condow.blob().at("a location").download_into_vec().await.unwrap();
assert_eq!(blob, b"a remote BLOB");

// Download part of a BLOB. Any Rust range syntax will work.
let blob = condow.blob().at("a location").range(2..=7).download_into_vec().await.unwrap();
assert_eq!(blob, b"remote");

let blob = condow.blob().at("a location").range(2..).download_into_vec().await.unwrap();
assert_eq!(blob, b"remote BLOB");

// get an `AsyncRead` implementation

use futures::AsyncReadExt;
let mut reader = condow.blob().at("a location").reader().await.unwrap();
let mut buf = Vec::new();
reader.read_to_end(&mut buf).await.unwrap();
assert_eq!(buf, b"a remote BLOB");

// get an `AsyncRead`+`AsyncSeek` implementation
use futures::AsyncSeekExt;
let mut reader = condow.blob()
    .at("a location")
    .trusted_blob_size(13)
    .random_access_reader()
    .finish().await.unwrap();
let mut buf = Vec::new();
reader.seek(std::io::SeekFrom::Start(2)).await.unwrap();
reader.read_to_end(&mut buf).await.unwrap();
assert_eq!(buf, b"remote BLOB");

重试

ConDow支持重试。这些可以在下载本身以及从客户端返回的字节流上执行。如果在流字节时发生错误,ConDow将尝试重连并从中断的地方恢复流。

也可以尝试在大小请求上进行重试。

请注意,某些客户端也可能根据其底层实现自行执行重试。在这种情况下,您应该禁用客户端或ConDow本身的重试。

行为

具有最大并发数3的下载会在发起下载的任务上流式传输。这意味着需要轮询返回的流以从网络中拉取块。执行流式传输还意味着底层库的panic将在轮询任务中弹出。

并发数大于或等于4的下载将在专用任务上执行。panic将被检测到,并且流将因错误而终止。

使用EnsureActivePull配置设置,所有下载都将执行在专用任务上,并且panic将被检测。

所有在专用任务上执行的下载将积极从网络中拉取字节并填充队列。

监控

监控可以针对每个单独的下载进行,或者集中进行全局监控。有关更多信息,请参阅[探针]模块。

依赖关系

~3.5–5.5MB
~91K SLoC