工程难点与最佳实践

大文件传输系统的工程难点:网关限制、临时文件清理、多实例部署、异步合并

#type / concept #status / evergreen #tech / dev / frontend #tech / dev / backend

[!info] related notes

工程难点与最佳实践

一句话定义

大文件传输系统的成熟度体现在幂等、可恢复、可校验、可观测、可清理、可扩展、安全这七个能力维度。

核心内容

常见工程难点

1. Nginx/网关限制

即使用了 chunk 上传,也可能被限制:

  • client_max_body_size
  • 请求超时
  • 代理读写超时

解决:后端上传链路必须检查网关层配置。

2. 临时 chunk 清理

用户传到一半不传了,chunk 会堆积。

解决

  • 超过 24 小时未完成的 upload_task 标为过期
  • 删除对应 chunk
  • 回收存储空间

3. 多实例部署状态一致性

后端有多个实例时:

  • chunk 可能落到不同机器
  • 合并任务不一定在同一台机器执行

解决

  • 用共享存储或统一写对象存储
  • 状态放数据库/Redis

4. 合并耗时长

几十 GB 文件合并可能要很久。

解决:把”合并”做成异步任务:

  1. 前端调用 complete
  2. 后端只做参数校验并投递任务
  3. 异步 worker 执行合并
  4. 前端轮询状态

设计原则

原则说明
前端一定分块不要硬传整文件
后端一定有 uploadId 和状态表否则无法做续传、重试、合并管理
chunk 接口一定幂等否则重试会把系统搞乱
最终结果一定做完整性校验不能只相信”所有 chunk 都上传完了”
大流量场景优先直传对象存储不要让业务服务器做大文件搬运工
进度条不能只看上传字节还要包含服务端处理状态
临时数据必须有回收机制否则磁盘迟早爆

成熟系统的能力维度

  1. 幂等:chunk 重传不乱
  2. 可恢复:断了能续
  3. 可校验:知道文件没坏
  4. 可观测:能看到失败在哪一块、哪一步
  5. 可清理:失败任务不会堆垃圾
  6. 可扩展:业务服务不会因为上传流量被拖死
  7. 安全:只有有权限的人能上传、下载、查看

边界与易混淆点

  • 前端 vs 后端职责边界:前端负责”拆开、送到、补传”;后端负责”认领、存好、拼回去、确认没坏”
  • 分阶段落地:先做基础可用(分块+状态+合并),再提升稳定性(续传+重试+幂等),最后提升体验(秒传+直传+异步合并)
创建于 2026/3/28 更新于 2026/5/27