Служба распределенного блокирования
Какую распределенную службу блокировки вы используете?
Требования:
- Взаимное исключение (блокировка), которое можно увидеть из разных процессов/машин
- блокировка... семантика выпуска
- Автоматическое освобождение блокировки после определенного таймаута - если фиксатор замка умирает, он автоматически освобождается через X секунд
- реализация Java
- Приятно иметь:.Net-реализацию
- Если это бесплатно: обнаружение/устранение тупика
- Простое развертывание, см. примечание ниже.
Мне не нужны ответы, например "это можно сделать через базу данных", или "это можно сделать через JavaSpaces" - я знаю. Я заинтересован в готовой, готовой, проверенной реализации.
Ответы
Ответ 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. Мнения и взгляды, выраженные в этом посте, являются моими собственными и не обязательно отражают мнения или взгляды моего работодателя.