Подтвердить что ты не робот

Что использовать вместо оператора "lock", когда код работает на нескольких машинах?

Оператор lock гарантирует, что один поток не входит в критический раздел кода, а другой поток находится в критическом разделе. Однако это не сработает, если рабочая нагрузка распределяется по ферме серверов (например, несколько серверов IIS + балансировщик нагрузки).

Поддерживает ли .NET такой сценарий?
Есть ли какой-либо класс, который может использоваться для управления выполнением критического раздела кода потоками, запущенными на нескольких машинах?

Если нет, существует ли стандартный метод решения таких проблем?

Этот вопрос был вдохновлен обсуждением которое началось здесь, но не ограничивается только SharePoint или ASP.NET.

4b9b3361

Ответ 1

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

Блокировки приложений (или мьютексы) в SQL Server 2005

Ответ 2

Оператор lock полезен только для совместного использования ресурсов внутри процесса.

Классы Mutex и EventWaitHandle полезны для совместного использования ресурсов между несколькими процессами на одной машине при использовании имен, начинающихся с "Global\".

Кроме того, вам придется реализовать что-то вне .NET, например, используя sp_getapplock/sp_releaseapplock в общей базе данных SQL.

Ответ 3

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

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

Изменить: если вам не нужны ресурсы (например, барьер), вы можете использовать, например, MSMQ для передачи сообщений между машинами. Вероятно, сокеты слишком низкие.

Ответ 4

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

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

Ответ 5

В .Net нет ничего, что могло бы поддерживать блокировку между машинами.

Стандартный метод заключается в том, чтобы переложить ответственность за такие вещи на одно место, возможно, на веб-сервис (а не на баланс нагрузки!), поэтому он все равно может быть вызван из нескольких мест. Или, альтернативно, определение одного ресурса, доступного для всех (например, базы данных), и использование этого в качестве единого ресурса для получения (например, запись в таблице блокировок, если ключ существует, блокировка не может быть получена до удаления строки)