Как реализовать критический раздел в Azure - PullRequest
0 голосов
/ 06 апреля 2011

Как реализовать критическую секцию в нескольких экземплярах в Azure?

Мы внедряем платежную систему на Azure. Когда в SQL-azure обновляется баланс счета, мы должны убедиться, что это значение на 100% правильно. Но у нас работает несколько веб-ролей, поэтому они смогут одновременно обслуживать два запроса от разных клиентов, что потенциально может обновить текущий баланс для одного продукта. Таким образом, оба экземпляра могут одновременно считывать старую сумму из базы данных, затем оба добавляют покупку к старому значению, и оба сохраняют новую сумму в базе данных. У того, кто спасет первым, изменения будут перезаписаны. : - (

Таким образом, нам необходимо реализовать критический раздел обо всех обновлениях баланса счета в базе данных. Но как это сделать в Azure? Руководства предлагают использовать очереди хранения Azure для взаимодействия между процессами. :-) Они гарантируют, что сообщение не будет удалено из очереди, пока оно не будет обработано. Даже если происходит сбой процесса, мы уверены, что сообщение будет обработано следующим процессом. (так как Azure гарантирует запуск нового процесса, если что-то зависнет)

Я думал о запуске одиночной рабочей роли для обслуживания запросов в очереди. Но Azure не гарантирует хорошее время безотказной работы, если вы не запускаете как минимум два экземпляра параллельно. Кроме того, при развертывании новых версий в Azure мне придется остановить запущенный экземпляр, прежде чем я смогу запустить новую. Наше приложение не может согласиться с тем, что «рабочая роль критического раздела» не обрабатывает сообщения в очереди в течение 2 секунд.

Таким образом, нам потребуется несколько рабочих ролей, чтобы гарантировать достаточно малое время простоя. В этом случае мы возвращаемся к той же проблеме реализации критических разделов в нескольких экземплярах в Azure.

Примечание. Если транзакция обновления не была завершена ранее, чем через 2 секунды, мы должны вернуть ее обратно и начать заново.

Будем весьма благодарны за любую идею о том, как реализовать критический раздел для всех экземпляров в Azure.

1 Ответ

0 голосов
/ 07 апреля 2011

Выполнение синхронизации между экземплярами является сложной задачей, и лучше всего попытаться обдумать проблему, чтобы вам не пришлось это делать.

В этом конкретном случае, если это так критично, как кажется, я бы просто оставил это на сервере SQL (он довольно хорошо справляется с конфликтами данных). Вместо того, чтобы экземпляры говорили «новое общее значение - X», вызовите хранимую процедуру в SQL, где вы просто передаете значение этой транзакции и учетную запись, которую хотите обновить. Что-то простое, как это:

UPDATE Account
SET
  AccountBalance = AccountBalance + @TransactionValue
WHERE
  AccountId = @AccountId

Если вам нужно обновить более одной таблицы, сделайте все это в одной хранимой процедуре и оберните ее в транзакцию SQL. Я знаю, что в нем не используются сексуальные технологии или фреймворки, но он гораздо менее сложен, чем любая альтернатива, о которой я могу подумать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...