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

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

Требования:

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

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

6 ответов

Решение

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


Обновить

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

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

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

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

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

Hazelcast:

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

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

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

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

Я рекомендую использовать Redisson, это Redis на основе In-Memory Data Grid. Он реализует знакомые структуры данных 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.

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

Oracle Coherence, который является очень стабильным и зрелым, включает поддержку взаимного исключения:

cache.lock(key, -1);
try {
  // ..
} finally {
  cache.unlock(key);
}

Блокировки выживают после сбоев сервера, повторного запуска и т. Д.

Ради полного раскрытия я работаю в Oracle. Мнения и взгляды, выраженные в этом посте, являются моими собственными и не обязательно отражают мнения или взгляды моего работодателя.

Другие вопросы по тегам