首页 > 解决方案 > 如何回滚 S3 文档上传?

问题描述

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

API 1 = REST API

API 2 = 将文件上传到 S3 的预签名 URL

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

API 3 即,仅当文件成功上传(API 2)到 S3 时才会进行数据库更新。

如果数据库更新(API 3)失败,API 2 所做的更改应该回滚,即上传的文件应该在 S3 中删除。

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

标签: c#sql-serveramazon-s3asp.net-web-api

解决方案


S3 服务不是事务性的。基本上所有其余的 api 都不是事务性的,因此所有操作都是原子的: 什么是新手的原子操作?

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

  1. 说没关系很容易。一旦本地数据库失败,我可以在 s3 上发出删除调用来删除我的文件。但是,如果这也失败了怎么办?

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

进入最终一致性的世界。

虽然有一些方法可以缓解重试问题(检查 polly 库以进行测试重试),但您可以做的是存储操作。

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

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


推荐阅读