В распределенной транзакции Azure лучше всего откатить полную операцию в случае сбоя одного вызова http
У меня есть приложение Azure API (AzureApi1), в котором есть действие, когда выполняется несколько HTTP-запросов. Операция вставляет данные в несколько таблиц в базу данных Azure Sql Db.
Затем он выполняет внешний вызов API (ExApi) из того же кода. Используя результаты внешнего вызова, он вставляет / обновляет некоторые другие таблицы. Это не в Azure.
Затем он вызывает другой API (AzureApi2), который находится в той же группе ресурсов, что и первая, и вставляет данные в другую базу данных Azure Sql Db, которая также находится в той же группе ресурсов.
Я использовал TransactionScope как в AzureApi1, так и в AzureApi2, который прекрасно работает для них индивидуально. Однако, поскольку между ними есть один Внешний API-интерфейс, который не находится под моим контролем, в случае сбоя при вызове API-интерфейса мне необходимо откатить всю операцию. В настоящее время первый API корректно откатывается, однако, поскольку второй API-вызов - это другой HTTP-вызов, он не попадает в область транзакции первого. Мне нужен подход для отката данных со второго Sql Db, а также в случае сбоя.
Каков наилучший вариант для ручного отката в такой ситуации?
1 ответ
Для распределенных транзакций между несколькими базами данных SQL Azure можно использовать эластичные транзакции базы данных. Но транзакции эластичной базы данных не могут распространяться на локальные базы данных SQL Server и Azure SQL. Для этой ситуации вам нужно создать своего собственного координатора распределенных транзакций.
Я предлагаю вам создать новый веб-API, который работает в качестве координатора для мониторинга состояния всех операций. Шаги могут быть такими, как следующие,
Если операция не работает, она должна отправить сообщение (успешно или неудачно) координатору.
Если все операции завершены, координатор отправит сообщение (фиксация или откат) всем операциям. Сообщение зависит от всех сообщений, полученных от каждой операции.
Каждая операция будет фиксировать изменения и отправлять результат фиксации (успех или неудача) координатору.
Координатор отправит окончательное состояние каждой операции в зависимости от результата фиксации, полученного от каждой операции.
Мы могли бы добавить тайм-аут для этих сообщений. Если истекло время ожидания, нам нужно откатить всю операцию.