文件操作接口,涉及状态和事务,请问如何设计?

一个发布项目用的接口,需要做这些操作:

  1. 检查此项目的状态,是否可以发布(只有未发布过的才可以发布)
  2. 后端上传文件(可能有很多个文件,现在一个请求是最多 10 并发上传)到云服务(对象存储),文件不在前端,在后端,发布之前不允许提前将这些文件传到云对象存储
  3. 文件全都上传成功后,改写此项目状态为已发布
  4. 返回结果,前端结束 loading 状态,提示发布成功

请问这个接口应该怎么设计?因为整体比较耗时,有可能在中间上传文件的过程中失败。

我先谈下我的理解:

  1. 检查项目状态的时候,就加上悲观锁,不允许其他请求读取此项目的状态
  2. 上传的过程中,如果有失败,就返回失败信息,结束此请求
  3. 都成功的话,就改写项目状态后,解锁,其他请求可以继续
阅读 485
2 个回答

其实建议你上传和发布其实可以分开来,理论上,你可以弄一个素材库,用户可以先独立把资源上传到素材库中,用户只要在发布任务过程中,选择素材库里的已上传的内容就行了

这样做就把发布与上传隔离开来了,也不用特意去出对项目状态加锁,或者说因为某个文件没有上传成功,导致不能发布其他项目

分开成多个接口

1、申请上传口令(检查状态,标记处理中),如果存在并发,标记处理这里可以引入分布式锁,或者简单的 Redis setnx。
2、上传图片(根据上传口令直传对象存储)
3、改写项目状态(发布,解除处理中标记)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏