Распределенная блокировка в .NET - PullRequest
4 голосов
/ 29 июля 2010

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

Вроде того же типа, что и Служба распределенной блокировки , но специально для поиска проектов, которые люди успешно интегрировали с .NET.

Ответы [ 3 ]

5 голосов
/ 15 марта 2016

Мы используем функциональность SqlServer application lock для распределенной блокировки.Это особенно удобно, если SqlServer уже является частью вашего стека.

Чтобы упростить работу с .NET, я создал пакет NuGet , который облегчает использование этой функциональности..

С этой библиотекой код выглядит следующим образом:

var @lock = new SqlDistributedLock("my_lock_name", connectionString);
using (@lock.Acquire())
{
   // critical region
}

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

2 голосов
/ 31 июля 2013

Если вы используете AppFabric для Windows Server, вы можете использовать это расширение DataCache .Вы также можете использовать блокировки redis с клиентом redis ServiceStack .

Обе являются реализациями .NET, но требуют серверного компонента.Я возился с реализацией распределенной блокировки PeerChannel, которая использует одноранговую связь и не требует какой-либо серверной инфраструктуры.Дайте мне знать, если вас это заинтересует.

0 голосов
/ 03 мая 2016

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

NCache помогает вам достичь этого.http://blogs.alachisoft.com/ncache/distributed-locking/

// Instance of the object used to lock and unlock cache items in NCache
LockHandle lockHandle = new LockHandle();

// Specify time span of 10 sec for which the item remains locked
// NCache will auto release the lock after 10 seconds.
TimeSpan lockSpan = new TimeSpan(0, 0, 10); 

try
{
    // If item fetch is successful, lockHandle object will be populated
    // The lockHandle object will be used to unlock the cache item
    // acquireLock should be true if you want to acquire to the lock.
    // If item does not exists, account will be null
    BankAccount account = cache.Get(key, lockSpan, 
    ref lockHandle, acquireLock) as BankAccount;
    // Lock acquired otherwise it will throw LockingException exception

    if(account != null &&; account.IsActive)
    {
        // Withdraw money or Deposit
        account.Balance += withdrawAmount;
        // account.Balance -= depositAmount;

        // Insert the data in the cache and release the lock simultaneously 
        // LockHandle initially used to lock the item must be provided
        // releaseLock should be true to release the lock, otherwise false
        cache.Insert("Key", account, lockHandle, releaseLock); 
    }
    else
    {
        // Either does not exist or unable to cast
        // Explicitly release the lock in case of errors
        cache.Unlock("Key", lockHandle);
    } 
}
catch(LockingException lockException)
{
    // Lock couldn't be acquired
    // Wait and try again
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...