Как реализовать критическую секцию в нескольких экземплярах в Azure?
Мы внедряем платежную систему на Azure.
Когда в SQL-azure обновляется баланс счета, мы должны убедиться, что это значение на 100% правильно.
Но у нас работает несколько веб-ролей, поэтому они смогут одновременно обслуживать два запроса от разных клиентов, что потенциально может обновить текущий баланс для одного продукта. Таким образом, оба экземпляра могут одновременно считывать старую сумму из базы данных, затем оба добавляют покупку к старому значению, и оба сохраняют новую сумму в базе данных. У того, кто спасет первым, изменения будут перезаписаны. : - (
Таким образом, нам необходимо реализовать критический раздел обо всех обновлениях баланса счета в базе данных. Но как это сделать в Azure? Руководства предлагают использовать очереди хранения Azure для взаимодействия между процессами. :-)
Они гарантируют, что сообщение не будет удалено из очереди, пока оно не будет обработано.
Даже если происходит сбой процесса, мы уверены, что сообщение будет обработано следующим процессом. (так как Azure гарантирует запуск нового процесса, если что-то зависнет)
Я думал о запуске одиночной рабочей роли для обслуживания запросов в очереди. Но Azure не гарантирует хорошее время безотказной работы, если вы не запускаете как минимум два экземпляра параллельно. Кроме того, при развертывании новых версий в Azure мне придется остановить запущенный экземпляр, прежде чем я смогу запустить новую. Наше приложение не может согласиться с тем, что «рабочая роль критического раздела» не обрабатывает сообщения в очереди в течение 2 секунд.
Таким образом, нам потребуется несколько рабочих ролей, чтобы гарантировать достаточно малое время простоя. В этом случае мы возвращаемся к той же проблеме реализации критических разделов в нескольких экземплярах в Azure.
Примечание. Если транзакция обновления не была завершена ранее, чем через 2 секунды, мы должны вернуть ее обратно и начать заново.
Будем весьма благодарны за любую идею о том, как реализовать критический раздел для всех экземпляров в Azure.