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

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

Какую распределенную службу блокировки вы используете?

Требования:

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

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

4b9b3361

Ответ 1

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


Обновление

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

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

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

Ответ 2

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

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

Hazelcast

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

Ответ 3

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

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

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

Ответ 4

Я рекомендую использовать Redisson it 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.

Ответ 5

ZooKeeper стал стандартом де-факто в распределенной блокировке с помощью Apache Куратор. Подробнее см. Блокировки recipes.

Ответ 6

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

  cache.lock(key, -1);
    try {
      // .. add your critical code here
    } finally {
      cache.unlock(key);
    }

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

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