当前位置: 首页 > 知识库问答 >
问题:

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

楚意
2024-03-29

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

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

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

我先谈下我的理解:

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

共有2个答案

林礼骞
2024-03-29

分开成多个接口

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

祝宾白
2024-03-29

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

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

 类似资料:
  • 问题内容: 我手头有问题,但无法获得要使用的设计模式。问题是这样的: 我必须构建一个具有“ N”个状态的系统,并且我的系统必须根据某些条件从任何状态转换为任何其他状态。示例:在条件1下,从状态1移到状态3,在条件2下从状态1移到状态4。 甚至从一种状态到另一种状态的转变都可以在2种或更多种不同的条件下完成。 例如,在以下 情况下可以完成从状态1到状态3的转换:条件1:“ Its a Sunday”

  • 我有一个获取发票的方法,它创建XML并将该XML发送到JMS队列,然后将发票保存到DB,更新状态为“invoinced”。下面是涉及Spring和Hibernate的伪代码。我的问题是:hibernate save rollsback Jms发送失败。或者,如果JMS发送失败,我如何回滚保存发票状态?这属于分布式事务管理。这里涉及哪些交易案例。谢谢

  • #全局事务状态表 状态 代码 备注 全局事务开始(Begin) 1 此状态可以接受新的分支事务注册 全局事务提交中(Committing) 2 这个状态会随时改变 全局事务提交重试(CommitRetry) 3 在提交异常被解决后尝试重试提交 全局事务回滚中(Rollbacking) 4 正在重新回滚全局事务 全局事务回滚重试中(RollbackRetrying) 5 在全局回滚异常被解决后尝试事

  • 问题内容: 我有一个Go函数,用于包装来自的函数。 这是完整的 C原型 : 可以在这里找到(至少在我的系统上)。 遵循Go代码: 除非删除对and 子句的调用,否则不会编译此代码。 该方法只能在 Mac OS X上使用, 并且如果从代码中删除, 则实际上可以 使用。 在收到以下错误消息后,以其实际形式显示:( 仅此而已,这就是整个编译器的输出)。 删除对我来说是不可接受的,我必须找到如何正确释放分

  • 大家好,请看我的问题: 现有微服务A、微服务B,两个服务链接的是不同的数据库而且不在同一个机器上。 微服务A中的数据库人员表(base_user)存放了一万条人员信息,微服务B中需要调用A的接口,将没有调入过的人员列表查询出来(然后在前端勾选后调入到B的sys_user表中)。 我的实现方式是: 首先从B的sys_user中查询出所有的人员id列表,然后通过该id列表调用A的接口,A的接口执行my

  • 我如何方便地在一个spring MVC请求处理程序中有条件地设置HTTP状态代码? 我有一个响应POST请求的请求处理程序,用于创建新资源。如果请求有效,我希望它重定向到新资源的URI,返回201(已创建)HTTP状态代码。如果请求是无效的,我希望它给用户一个机会来纠正提交的表单中的错误,而不应该给出201的状态代码。 } 但这不会给出重定向情况的正确响应状态。 我不能简单地添加一个,因为有两种可