首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何回滚S3文档上传?

如何回滚S3文档上传?
EN

Stack Overflow用户
提问于 2021-02-20 00:03:54
回答 2查看 141关注 0票数 0

我向一个REST API (设为API 1)发出请求,该API在内部同步调用另外2个API(API 2和3)。

API 1= REST API

API 2=用于将文件上传到S3的预签名url

API 3=数据库更新(SQL Server)

API3即,只有当文件成功上传(API2)到S3中时,才会进行DB更新。

如果DB更新(API3)失败,则应回滚API2DID的更改,即应在S3中删除上传的文件。

请建议如何处理这种情况。欢迎任何开箱即用的解决方案。

EN

回答 2

Stack Overflow用户

发布于 2021-02-20 00:29:32

S3服务不是事务性的。基本上,所有rest都不是事务性的,所以所有操作都是原子的:What are atomic operations for newbies?

这意味着如果操作成功,您将无法回滚操作。

  1. 说没问题是很容易的。一旦本地数据库失败,我可以在s3上发出delete调用来删除我的文件。但如果这也失败了会发生什么呢?

  1. 另一种方法是首先写入数据库,然后发布文件。同样,如果文件上传失败,您可以回滚db命令。这样更安全,但还是..。当您发送请求但获得超时时会发生什么?文件可能在服务器上,但您不会知道。

进入最终一致性的世界。

虽然有一些方法可以通过重试来缓解这个问题(请查看polly库中的测试重试),但您可以做的是存储操作。

您想要上传文件。将其添加到队列中并运行任务。将任务标记为失败。根据需要多次重试,并标记失败原因。

这就是手动干预。当所有其他方法都失败时,应该有人用一些解决策略进行干预。

票数 2
EN

Stack Overflow用户

发布于 2021-02-20 00:58:41

如果你需要“撤销”上传到任何文件系统(S3是一个文件系统),你可以这样做。

  1. 使用某个临时的唯一文件名上载新文件( guid即可)。
  2. 若要“提交”上载,请删除要替换的文件并重命名刚上载的文件,使其与旧文件同名。
  3. 若要“回滚”上载,请删除临时文件。

如果您的应用程序允许,一种更好的方法是为每个版本的文件指定不同的名称。然后,您只需上传每个新的名称,并通过删除旧的名称进行清理。

在您的特定场景中,首先执行数据库更新操作,然后再执行上载操作可能是有意义的,如果这不会使您面临严重的竞争条件的话。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66280958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档