У нас есть требование управлять параллельными операциями задачи. Короче говоря, только одна версия этой задачи может быть запущена в любой момент времени.Распределенный механизм блокировки. NET
Проблема в том, что мы будем работать в многосерверной среде.
Требования:
- Разрешить однократно экземпляр метода для запуска в любое время. (Мьютекс OS).
- Должен работать в среде с несколькими серверами.
- Мьютекс должен быть отброшен, если процесс замирает.
- Должно быть надежное и зрелое решение.
Окружающая среда:
- Windows Server (на предпосылке)
- .Net
- Azure
Вещи, которые я рассмотрел до сих пор:
- OS мьютекс : Работает на emise, unsure, если он отпустит блокировку на смерти процесса. Также не уверены, поддерживает ли Windows надежный мьютекс.
- DB Flag: работает на основе, работает на нескольких серверах. Не разблокирует процесс смерти.
- AppFabric: Работает на посылке, хотя дополнительный этап настройки нежелателен. Работает на нескольких серверах. Не будет разблокировать процесс смерти, хотя блокировки могут быть установлены на тайм-аут при приобретении. (лучше всего до сих пор)
- CIFS File lock: работает на посылке, работает на нескольких серверах, должен разблокировать о смерти процесса. Не удается выполнить надежный тест, хотя это может быть уклон .
Я предполагаю, что это довольно распространенная проблема, и мне интересно узнать, как сообщество обычно решает ее.
Мне особенно интересно слышать мысли о решении блокировки CIFS или использовать MSMQ?
Re DB flag: «Не будет разблокировать процесс смерти.»- это разрешимо с тайм-аутом и пульсом, хотя лично я использую redis:' SET {lock-name} {произвольный токен} NX EX {expiry-timeout} '(и проверить возвращаемое значение, выполненную работу) (см. раздел «Шаблоны» на странице «set»: http://redis.io/commands/set) –