gpt4 book ai didi

c# - 在 Azure 分布式事务中,如果一个 http 调用失败,回滚完整操作的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-03 03:06:56 25 4
gpt4 key购买 nike

我有一个 Azure api 应用程序 (AzureApi1),它有一个发出多个 http 请求的操作。该操作将多个表的数据插入到 Azure Sql Db。

然后,它从同一代码中进行外部 API 调用 (ExApi)。使用外部调用的结果插入/更新一些其他表。这不在 Azure 中。

然后,它调用另一个 api (AzureApi2),该 API 与第一个 API 位于同一资源组中,并将数据插入到也位于同一资源组中的另一个 Azure Sql Db。

我在 AzureApi1 和 AzureApi2 中都使用了 TransactionScope,这对它们单独工作得很好。但是,由于中间有一个外部 api,并且该 api 不在我的控制范围内,因此如果该 api 调用发生任何故障,我需要回滚整个操作。目前,第一个 api 正在正确回滚,但是,由于第二个 api 调用是不同的 http 调用,因此它不属于第一个 api 的事务范围。如果发生任何失败,我还需要一种方法来回滚第二个 Sql Db 中的数据。

在这种情况下手动回滚的最佳选择是什么?

最佳答案

对于多个 Azure SQL DB 之间的分布式事务,您可以使用 elastic database transactions 。但弹性数据库事务无法跨本地 SQL Server 和 Azure SQL 数据库延伸。您需要针对这种情况创建自己的分布式事务协调器。

我建议您创建一个新的 Web API,它作为协调器来监视所有操作的状态。步骤可能如下所示,

  1. 如果操作失败,它应该向协调器发送一条消息(成功或失败)。

  2. 如果所有操作都完成,协调器将向所有操作发送消息(提交或回滚)。该消息取决于从每个操作接收到的所有消息。

  3. 每个操作都会提交更改并将提交结果(成功或失败)发送给协调器。

  4. 协调器将根据每个操作收到的提交结果向每个操作发送最终状态。

  5. 我们可以为这些通信添加超时。如果发生超时,我们需要回滚所有操作。

关于c# - 在 Azure 分布式事务中,如果一个 http 调用失败,回滚完整操作的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43723178/

25 4 0