Служба распределенной блокировки
Какой сервис распределенной блокировки вы бы использовали?
Требования:
- Взаимное исключение (блокировка), которое видно из разных процессов / машин
- блокировка... освобождение семантики
- Автоматическое снятие блокировки после определенного времени ожидания - если держатель замка умирает, он автоматически освобождается через X секунд
- Реализация Java
- Приятно иметь:.Net реализацию
- Если это бесплатно: обнаружение / устранение тупиковых ситуаций
- Простота развертывания, см. Примечание ниже.
Меня не интересуют ответы типа "это может быть сделано через базу данных" или "это может быть сделано через JavaSpaces" - я знаю. Я заинтересован в готовой, готовой, проверенной реализации.
6 ответов
Teracotta, включая версию с открытым исходным кодом, распространила семантику блокировки, используя либо synchronized
или java.util.concurrent.ReentrantReadWriteLock
- последний, очевидно, соответствует вашим требованиям.
Обновить
Поскольку в вопрос теперь добавлено требование "смешивания" с GigaSpaces, я хочу сказать, что не смешивайте их. Это только увеличит сложность вашего технологического стека и позволит:
- интеграция с точки зрения как кода, так и инфраструктуры;
- управление синхронизацией между ними;
- обучение / настройка / отладка теракотты.
лучше потратить на создание или реализацию решения для блокировки на основе GigaSpaces.
Более новый ребенок на блоке - фундук. Я играл с ним, и он удивительно прост в использовании и настройке.
Насколько я вижу, не должно быть никакого конфликта между Gigaspaces и hazelcast, так как у hazelcast нет никаких зависимостей, т.е. нет jgroups.jar и т. Д.
Hazelcast:
- Взаимное исключение (блокировка), да реализация
java.util.concurrency.locks.Lock
- Автоматическое снятие блокировки после определенного времени ожидания, да все блокировки снимаются, если участник покидает кластер
- Реализация Java, да
- Приятно иметь: реализацию.Net, nope - чистое решение Java, возможно, можно портировать на j#
- Если это бесплатно: обнаружение / устранение тупиков, нет, мой Hazelcast не предпринимает никаких усилий, чтобы справиться с этим
- Простое развертывание, это одна банка с одним файлом конфигурации, развернутая как часть вашего приложения, никаких дополнительных процессов не требуется
Проверьте 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. Мнения и взгляды, выраженные в этом посте, являются моими собственными и не обязательно отражают мнения или взгляды моего работодателя.