Skip to content

[Feature] 跨 Storage Copy 支持单文件多连接传输 #3141

Description

@Captain-Nemo-Xu

请确认以下事项

  • 我已确认阅读并同意 AGPL-3.0 第15条 。
    本程序不提供任何明示或暗示的担保,使用风险由您自行承担。

  • 我已确认阅读并同意 AGPL-3.0 第16条 。
    无论何种情况,版权持有人或其他分发者均不对使用本程序所造成的任何损失承担责任。

  • 我确认我的描述清晰,语法礼貌,能帮助开发者快速定位问题,并符合社区规则。

  • 我已确认阅读了OpenList文档。

  • 我已确认没有重复的问题或讨论。

  • 我认为此问题必须由OpenList处理,而非第三方。

  • 我已确认此功能尚未被实现。

  • 我已确认此功能是合理的,且有普遍需求,并非我个人需要。

  • 我没有阅读这个清单,只是闭眼选中了所有的复选框,请关闭这个 Issue 。

需求描述

[Feature] 跨 Storage Copy 支持单文件多连接传输

背景

OpenList挂载的公共网盘上,存在大量 .zip、.iso、.mp4等大文件,有时需要归集到NAS本地,目前通过跨storage 复制到挂载的NAS本地路径上大文件性能较低,经常得通过aria2离线下载方式“曲线救国”,通过ChatGPT分析了一下当前实现,特提功能建议,以下由ChatGPT根据我的需求描述生成:

OpenList 当前已经支持通过 tasks.copy.workers 并发执行多个 Copy Task。

但对于单个超大文件,增加 copy.workers 并不能提高该文件本身的传输并发度。

例如:

copy.workers = 5

可以同时复制 5 个文件,但一个 100 GB 文件仍然主要依赖单一传输链路。

对于“公共网盘 → 本地 NAS”的场景,这可能成为单个大文件的吞吐瓶颈。

建议

希望跨 Storage Copy 支持单文件分段 / Range 多连接传输。

例如:

Source Storage
      │
      ├── Range 0 ──┐
      ├── Range 1 ──┤
      ├── Range 2 ──┼──→ OpenList → Destination Storage
      └── Range 3 ──┘

实现思路

建议增加类似:

tasks:
  copy:
    workers: 5
    connections: 4

其中:

  • workers:同时执行多少个 Copy Task / 文件;
  • connections:单个文件使用多少个并发连接。

两者应该相互独立。

Aria2 也可以作为一种实现方案

OpenList 当前已经具备 Aria2 Offline Download 能力。

因此也可以考虑在跨 Storage Copy 中,对于满足条件的文件:

Public Cloud Storage
        ↓
      Link()
        ↓
   Aria2 / Range
        ↓
   Local temporary file
        ↓
Destination Storage

利用 Aria2 的多连接下载能力完成单文件高速传输,然后再移动/导入到目标 Storage。

如果采用这种方式,希望能够:

  • 复用现有 Aria2 配置;
  • 支持 Aria2 多连接/分段下载;
  • 正确显示 Copy Task 的总体进度;
  • 下载完成后自动进入目标 Storage;
  • 失败时能够重试;
  • 不支持 Range 或无法使用 Aria2 时自动回退到当前 Copy 实现。

如果直接在 OpenList 的 Copy pipeline 中实现 Range 并发,而不经过 Aria2,同样可以接受。

这里更重要的是实现单文件多连接传输能力,而不是限定具体实现方式。

使用场景

例如:

百度网盘
   ↓
OpenList
   ↓
本地 NAS

对于多个小文件:

copy.workers
      ↓
多个文件同时复制

对于单个大文件:

connections
      ↓
同一个文件使用多个连接

因此需要同时支持:

任务级并发
    +
单文件级并发

兼容性建议

并不是所有 Storage Driver 都支持 Range,因此建议根据实际能力自动选择:

  1. Source Driver 支持 Range / Seek,并且 URL 支持 HTTP Range:

    • 使用多连接分段传输;
  2. 可以通过 Aria2 获取并发下载:

    • 可以使用 Aria2;
  3. 不支持上述能力:

    • 自动回退到当前 Copy 实现。

不应影响现有 Storage Driver 和 Copy 行为。

进度

如果采用分段或 Aria2 下载,希望 Copy Task 能正确显示:

  • 总进度
  • 当前速度
  • 已传输大小
  • ETA
  • 失败/重试状态

例如:

example.iso
62% | 320 MB/s | 38.4 GB / 62 GB

为什么 copy.workers 不足

目前:

File A ──────── Worker 1
File B ──────── Worker 2
File C ──────── Worker 3

解决的是多个文件并发。

本 Feature 希望进一步支持:

File A
 ├── Connection 1
 ├── Connection 2
 ├── Connection 3
 └── Connection 4

解决的是单个文件并发。

这两个并发维度并不冲突。

目标

主要针对:

Public Cloud Storage
        ↓
     OpenList
        ↓
     Local / NAS

尤其是几十 GB 或数百 GB 的大文件。

希望 OpenList 在 Source Storage 支持 Range / 多连接的情况下,可以充分利用本地网络和 NAS 可用带宽,而不受单一传输连接限制。


The implementation does not have to be based on Aria2. Direct ranged/concurrent transfer in the Copy pipeline is also acceptable. The main goal is to support efficient multi-connection transfer for a single large file.

附加信息

No response

AI生成内容

  • 我使用了AI工具生成此内容
  • 我没有使用AI工具生成此内容

AI模型是

ChatGPT

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions