Files
sionrui/yudao-module-tik/UPLOAD_STRATEGY.md
2025-11-16 19:35:55 +08:00

2.4 KiB
Raw Blame History

文件上传策略分析

🎯 业界成熟方案先上传OSS再存数据库

方案对比

方案 优点 缺点 适用场景
先上传OSS再存数据库 1. OSS上传失败不影响数据库
2. 数据库事务可快速回滚
3. 用户体验好(文件已上传)
4. 孤立文件可定时清理
1. 数据库失败会产生孤立文件
2. 需要清理机制
推荐方案(业界主流)
先存数据库再上传OSS 1. 数据库失败不会上传OSS
2. 不会产生孤立文件
1. OSS上传失败需要回滚数据库
2. 数据库事务时间长
3. 用户体验差
不推荐

为什么选择"先上传OSS再存数据库"

  1. 性能优势

    • OSS上传是外部服务调用不应该阻塞数据库事务
    • 数据库事务时间短,减少锁竞争
  2. 可靠性优势

    • OSS上传失败直接返回错误不产生脏数据
    • 数据库保存失败OSS文件可以后续清理定时任务
  3. 用户体验优势

    • 文件已上传成功,即使数据库失败,文件还在
    • 可以重试数据库保存,无需重新上传
  4. 业界实践

    • 阿里云、腾讯云、AWS 等主流云服务都推荐此方案
    • 大多数开源项目采用此方案

当前实现方案

1. 校验(文件分类、配额)
   ↓
2. 读取文件内容
   ↓
3. 上传到OSSFileService.createFile
   - 成功:返回 fileUrl 和 filePath
   - 失败:直接抛出异常,不保存数据库
   ↓
4. 保存数据库(事务中)
   - 成功返回文件ID
   - 失败删除OSS文件抛出异常
   ↓
5. 更新配额

异常处理

  1. OSS上传失败

    • 直接抛出异常,不保存数据库
    • 用户可重试上传
  2. 数据库保存失败

    • 删除已上传的OSS文件清理
    • 抛出异常,用户可重试
  3. 孤立文件清理

    • 定时任务清理未关联数据库的OSS文件
    • 基于 infra_file 表的创建时间判断

优化建议

  1. 异步清理孤立文件

    • 定时任务扫描 infra_file 表
    • 删除超过7天未关联 tik_user_file 的文件
  2. 重试机制

    • 数据库保存失败时,记录重试队列
    • 后台任务重试保存
  3. 监控告警

    • 监控OSS上传失败率
    • 监控数据库保存失败率
    • 监控孤立文件数量