我向一个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中删除上传的文件。
请建议如何处理这种情况。欢迎任何开箱即用的解决方案。
发布于 2021-02-20 00:29:32
S3服务不是事务性的。基本上,所有rest都不是事务性的,所以所有操作都是原子的:What are atomic operations for newbies?
这意味着如果操作成功,您将无法回滚操作。
进入最终一致性的世界。
虽然有一些方法可以通过重试来缓解这个问题(请查看polly库中的测试重试),但您可以做的是存储操作。
您想要上传文件。将其添加到队列中并运行任务。将任务标记为失败。根据需要多次重试,并标记失败原因。
这就是手动干预。当所有其他方法都失败时,应该有人用一些解决策略进行干预。
发布于 2021-02-20 00:58:41
如果你需要“撤销”上传到任何文件系统(S3是一个文件系统),你可以这样做。
如果您的应用程序允许,一种更好的方法是为每个版本的文件指定不同的名称。然后,您只需上传每个新的名称,并通过删除旧的名称进行清理。
在您的特定场景中,首先执行数据库更新操作,然后再执行上载操作可能是有意义的,如果这不会使您面临严重的竞争条件的话。
https://stackoverflow.com/questions/66280958
复制相似问题