c# - 如何回滚 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 中删除。
请告知如何处理这种情况。欢迎任何开箱即用的解决方案。
解决方案
S3 服务不是事务性的。基本上所有其余的 api 都不是事务性的,因此所有操作都是原子的: 什么是新手的原子操作?
这意味着如果操作成功,您将无法回滚操作。
说没关系很容易。一旦本地数据库失败,我可以在 s3 上发出删除调用来删除我的文件。但是,如果这也失败了怎么办?
另一种方法是先写入数据库,然后发布文件。同样,如果文件上传失败,您可以回滚 db 命令。这更安全,但仍然......当您发送请求但超时时会发生什么?该文件可能在服务器上,但您不知道。
进入最终一致性的世界。
虽然有一些方法可以缓解重试问题(检查 polly 库以进行测试重试),但您可以做的是存储操作。
您要上传文件。将其添加到队列并运行任务。将任务标记为失败。根据需要重试多次并标记失败原因。
这是手动干预。当所有其他方法都失败时,应该有人干预一些解决策略。
推荐阅读
- java - 遇到意外文本时抛出什么异常?
- bash - 如果该部分具有搜索关键字 [BASH],如何从文件中打印特定部分
- c++ - 如何在我的 Windows 应用程序中捕获 CTRL 键 PRESSED 和 RELEASED?
- android - 使用 viewmodel 加载 Webview
- javascript - chart.js 在通过按钮单击修改的图表之间跳过的问题
- java - Conversion of python code to java
- asp.net - fetching data from server running on local computer
- assembly - ARM Assembly: declaring a variable visible anywhere in current file & in the program
- javascript - 使用 React 16.3.2 时未调用 UNSAFE_componentWillReceiveProps
- mysql - 购买超过 250 美元的客户