it-roy-ru.com

Служба распределенной блокировки

Какой сервис распределенной блокировки вы бы использовали?

Требования:

  1. Взаимное исключение (блокировка), которое видно из разных процессов/машин
  2. блокировка ... освобождение семантики
  3. Автоматическое снятие блокировки после определенного времени ожидания - если держатель замка умирает, он автоматически освобождается через X секунд
  4. Реализация Java
  5. Приятно иметь: .Net реализацию
  6. Если это бесплатно: обнаружение/устранение тупиковых ситуаций
  7. Простота развертывания, см. Примечание ниже.

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

54
ripper234

Teracotta , включая версию с открытым исходным кодом, распространил семантику блокировки, используя либо synchronized, либо Java.util.concurrent.ReentrantReadWriteLock - последний, очевидно, соответствует вашим требованиям.


Update

Поскольку в вопрос теперь добавлено требование "смешивания" с GigaSpaces, я хочу сказать не смешивать их . Это просто добавит сложности вашему технологическому стеку и усилиям:

  • интеграция с точки зрения как кода, так и инфраструктуры;
  • управление синхронизацией между ними;
  • обучение/настройка/отладка теракотты.

лучше потратить на создание или реализацию решения для блокировки на основе GigaSpaces.

13
Robert Munteanu

Более новый ребенок в блоке hazelcast . Я играл с ним, и он удивительно прост в использовании и настройке.

Насколько я вижу, между Gigaspaces и hazelcast не должно быть никакого конфликта, так как hazelcast не имеет никаких зависимостей, то есть нет jgroups.jar и т.д.

Hazelcast :

  1. Взаимное исключение (блокировка), да реализация Java.util.concurrency.locks.Lock
  2. Автоматическое снятие блокировки после определенного времени ожидания, да все блокировки снимаются, если участник покидает кластер
  3. Реализация Java, да
  4. Приятно иметь: .Net реализацию, nope - это чистое Java решение, может быть возможно портировать на j #
  5. Если это бесплатно: обнаружение/устранение тупиков, нет, мой Hazelcast не предпринимает никаких усилий, чтобы справиться с этим
  6. Простое развертывание, это одна банка с одним файлом конфигурации, развернутая как часть вашего приложения, никаких дополнительных процессов не требуется
22
Gareth Davis

Проверьте Apache Zookeeper (подпроект Hadoop) - он предлагает распределенную синхронизацию. Документация не очень хорошая, но то, что есть, делает ее интересным продуктом - ознакомьтесь с рецептами идей о том, как использовать Zookeeper.

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

Вы можете смоделировать различные стратегии блокировки, и она предлагает решение для умирающего держателя замка (эфемерные узлы).

13
Steven Dick

Я рекомендую использовать Redisson это Redis на основе сетки данных в памяти. Он реализует знакомые структуры данных Java, включая распределенные объекты Java.util.Lock и Java.util.concurrent.ReentrantReadWriteLock. В том числе возможность настройки leaseTime. Пример использования Lock:

Redisson redisson = Redisson.create(config);

Lock lock = redisson.getLock("anyLock");
try {
   // unlock automatically after 10 seconds of hold
   lock.lock(10, TimeUnit.SECONDS);

} finally {
   lock.unlock();
}

...

redisson.shutdown();

Поддерживает облачных поставщиков, таких как Azure и AWS.

6
Nikita Koksharov

ZooKeeper де-факто стал стандартом распределенной блокировки с помощью Apache Curator framework. Проверьте замки в рецепты для получения дополнительной информации.

3
frail