Dans la transaction dissortingbuée Azure, quelle est la meilleure approche pour annuler le fonctionnement complet en cas d'échec d'un appel http?

J'ai une application api Azure (AzureApi1), qui a une action où plusieurs requests http sont faites. L'opération insère des données dans plusieurs tables dans un Db Azure Sql.

Il effectue ensuite un appel d'api externe (ExApi) à partir du même code. En utilisant les résultats de l'appel externe, il insère / met à jour d'autres tables. Ce n'est pas dans Azure.

Ensuite, il appelle une autre API (AzureApi2) qui se trouve dans le même groupe de ressources que le premier et qui insère des données dans un autre DQ Azure Sql qui se trouve également dans le même groupe de ressources.

J'ai utilisé TransactionScope dans AzureApi1 et AzureApi2 qui fonctionne bien pour eux individuellement. Cependant, comme il y a une API externe entre et qui n'est pas sous mon contrôle, en cas de défaillance de cet appel API, je dois annuler l'opération complète. Actuellement, la première API est en train de revenir correctement, car le deuxième appel API est un appel http différent, il ne tombe pas avec la scope de la transaction du premier. J'ai besoin d'une approche pour annuler datatables de la seconde database SQL si un échec survient.

Quelle est la meilleure option pour revenir manuellement dans une situation comme celle-ci?

Pour une transaction dissortingbuée entre plusieurs bases de données SQL Azure, vous pouvez utiliser des transactions de database élastiques . Mais les transactions de database élastiques ne peuvent pas s'étendre sur les bases de données SQL Server et Azure SQL. Vous devez créer votre propre coordinateur de transactions dissortingbuées pour cette situation.

Je vous suggère de créer une nouvelle API Web qui fonctionne comme un coordinateur pour surveiller l'état de toutes les opérations. Les étapes pourraient être comme suit,

  1. Si une opération est en panne, elle doit envoyer un message (succès ou échec) au coordinateur.

  2. Si toutes les opérations sont terminées, le coordinateur enverra un message (commit ou rollback) à toutes les opérations. Le message dépend de tous les messages reçus de chaque opération.

  3. Chaque opération validera les modifications et enverra le résultat de la validation (succès ou échec) au coordinateur.

  4. Le coordinateur enverra l'état final à chaque opération en fonction du résultat de validation reçu de chaque opération.

  5. Nous pourrions append un timeout d'attente pour ces communications. Si le timeout d'attente est arrivé, nous devons annuler toute l'opération.