第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/O | IO 密集型选协程;CPU 密集型选线程池 |
| 存储写入策略 | 每块即时刷盘(安全但慢) | 批量写入+周期性刷盘(高性能) | 对丢块零容忍选即时刷盘 |
2.4 风险点
· 边界泄漏:队列直接操作存储的临时文件路径或网络模块的内部连接池,导致修改时牵一发动全身。
· 粘滞性错误:网络请求返回瞬时错误,队列频繁重试,雪崩导致连接池或磁盘 I/O 满载。
· 状态不同步:任务管理认为任务已完成,但队列尚未 flush 元数据;宕机后任务状态丢失。
· 死锁:队列持有锁等待存储写入完成,而存储写入因磁盘满阻塞,此时任务管理回调队列导致线程池耗尽。
2.5 边界落地步骤
- 定义接口契约文件(如 Protobuf、OpenAPI 或 Java interface):明确每个边界的输入/输出、异常类型、超时阈值。
- 实现边界适配器:每个边界一侧增加 Adapter 层,隔离内部实现变更对另一侧的影响。
- 引入健康探针:网络请求模块需暴露
isHealthy()接口,队列据此动态调整并发数。 - 增加限流与熔断:队列调用存储和网络时,使用令牌桶或漏桶算法防止下游过载。
- 集成边界测试套件:Mock 对端模块,验证边界超时、重试、幂等性。
2.6 验收标准
- 任务管理推送 1000 个任务后,队列按优先级正确出队,任务状态回调不丢失。
- 网络请求模拟 30% 的连接超时,队列重试不超过配置次数且能正确放弃。
- 存储模块在写入过程中被强制 kill,重启后队列能从持久化快照恢复未完成的任务。
- 所有边界调用均通过接口文件生成桩代码,无直接字段引用或内部类耦合。