第2章 队列模块边界:下载队列与任务管理、网络请求、存储模块的边界划分

下载队列并非孤立运行,它与三个核心系统模块存在紧密的交互:任务管理(负责任务生命周期与状态机)、网络请求(执行实际数据传输)、存储模块(管理文件落盘与元数据持久化)。边界划分决定了模块间耦合程度、数据一致性保障以及故障隔离能力。本章聚焦于这三个边界上的职责、数据流/控制流、信任链路及工程化选择。

2.1 模块边界总览

边界方向上游/下游职责范围通信方式
下载队列 → 任务管理上游依赖接收待处理任务,回调任务状态变更接口回调 + 事件总线
下载队列 → 网络请求下游调用出队后发起 HTTP/RPC 下载请求,携带重试与超时策略异步调用 + 连接池
下载队列 → 存储模块下游调用写入下载数据块,持久化队列快照文件 I/O + 事务日志

2.2 边界详析

2.2.1 下载队列 ↔ 任务管理

职责分离:任务管理维护任务的全生命周期状态(pending → running → paused → failed/completed),而下载队列只关心“可执行任务”的排队与调度。任务管理调用 enqueue(task) 将任务送入队列;任务完成或失败后,队列通过回调 onTaskComplete(taskId, status) 通知任务管理。

  • 数据流:任务对象(含 URL、目标路径、优先级、依赖关系) → 队列;状态变更事件 ← 队列。
  • 控制流:任务管理控制暂停/恢复、优先级提升;队列仅控制请求并发数。
  • 信任链路:队列假设任务管理传入的任务已通过有效性校验(URL 合法、磁盘空间足够);任务管理信任队列不会丢失任务(借助持久化保证)。

2.2.2 下载队列 ↔ 网络请求

职责分离:网络请求模块负责 socket 连接、TLS 握手、分块传输、超时重连;下载队列负责业务层面的重试策略(最多重试次数、退避算法、错误归类)。队列调用 download(url, range, timeout) 获取响应流,将数据块推送给存储模块。

  • 数据流:URL + 请求头 → 网络模块;字节流 + 响应状态码 ← 网络模块。
  • 控制流:队列控制并发连接数(线程池/协程池)、暂停/恢复网络请求;网络模块反馈连接失败、资源不可达等错误码。
  • 信任链路:队列假定网络模块能严格遵守超时设置并在错误时快速失败;网络模块假定队列不会传入无效协议或不一致的 Range 头。

2.2.3 下载队列 ↔ 存储模块

职责分离:存储模块管理临时文件、最终文件路径、磁盘空间回收、元数据持久化;下载队列负责块的顺序写入与校验。队列调用 append(taskId, dataChunk, offset) 将字节顺序写入临时文件,并在下载完成后调用 commit(taskId) 原子性地将临时文件重命名为目标路径。

  • 数据流:数据块(字节数组) → 存储模块;写入结果(成功/失败、磁盘满) ← 存储模块。
  • 控制流:队列控制写入顺序(避免乱序覆盖),存储模块控制磁盘空间监控与垃圾回收。
  • 信任链路:队列假设存储模块的 commit 操作是幂等的且具有原子性;存储模块假设队列不会在未完成写入前调用 commit。

2.3 选型权衡

决策点方案 A方案 B推荐场景
队列与任务管理通信同步 RPC(紧耦合,延迟低)事件驱动(松耦合,可扩展)中小规模选同步;大规模分布式选事件驱动
网络请求的并发控制全局线程池+信号量协程+异步 I/OIO 密集型选协程;CPU 密集型选线程池
存储写入策略每块即时刷盘(安全但慢)批量写入+周期性刷盘(高性能)对丢块零容忍选即时刷盘

2.4 风险点

· 边界泄漏:队列直接操作存储的临时文件路径或网络模块的内部连接池,导致修改时牵一发动全身。

· 粘滞性错误:网络请求返回瞬时错误,队列频繁重试,雪崩导致连接池或磁盘 I/O 满载。

· 状态不同步:任务管理认为任务已完成,但队列尚未 flush 元数据;宕机后任务状态丢失。

· 死锁:队列持有锁等待存储写入完成,而存储写入因磁盘满阻塞,此时任务管理回调队列导致线程池耗尽。

2.5 边界落地步骤

  1. 定义接口契约文件(如 Protobuf、OpenAPI 或 Java interface):明确每个边界的输入/输出、异常类型、超时阈值。
  2. 实现边界适配器:每个边界一侧增加 Adapter 层,隔离内部实现变更对另一侧的影响。
  3. 引入健康探针:网络请求模块需暴露 isHealthy() 接口,队列据此动态调整并发数。
  4. 增加限流与熔断:队列调用存储和网络时,使用令牌桶或漏桶算法防止下游过载。
  5. 集成边界测试套件:Mock 对端模块,验证边界超时、重试、幂等性。

2.6 验收标准

  • 任务管理推送 1000 个任务后,队列按优先级正确出队,任务状态回调不丢失。
  • 网络请求模拟 30% 的连接超时,队列重试不超过配置次数且能正确放弃。
  • 存储模块在写入过程中被强制 kill,重启后队列能从持久化快照恢复未完成的任务。
  • 所有边界调用均通过接口文件生成桩代码,无直接字段引用或内部类耦合。

2.7 边界结构图

下载队列模块边界与交互 下载队列 调度 · 状态 · 并发控制 任务管理 生命周期 优先级 · 依赖 网络请求 连接 · TLS · 分块 超时 · 重连 存储模块 文件 I/O · 临时文件 快照 · 持久化 图例说明 数据流(接口调用 + 字节) 控制流(回调 / 事件) 信任链路(隐式契约) enqueue(task) onComplete/onFailed download(url, range) 字节流+状态码 append(chunk, offset) commit() 结果/错误

2.8 小结