Quel service de verrouillage distribué utiliseriez-vous?
Les exigences sont:
Je ne suis pas intéressé par des réponses comme "cela peut être fait sur une base de données" ou "cela peut être fait sur JavaSpaces" - je sais. Je suis intéressé par une implémentation prête, prête à l'emploi et éprouvée.
Teracotta , y compris l'édition Open Source, a distribué la sémantique de verrouillage en utilisant synchronized
ou Java.util.concurrent.ReentrantReadWriteLock
- ce dernier répondant apparemment à vos besoins.
Mise à jour
Étant donné que la question a maintenant ajouté l'exigence de "mélange" avec GigaSpaces, je vais dire ne faites pas mélangez-les. Cela va simplement ajouter plus de complexité à votre pile technologique, et l'effort de:
sera mieux dépensé pour créer ou implémenter une solution de verrouillage basée sur GigaSpaces.
Un enfant plus récent sur le bloc est Hazelcast . J'ai joué avec et c'est incroyablement simple à utiliser et à configurer.
Pour autant que je puisse voir, il ne devrait pas y avoir de conflit entre Gigaspaces et Hazelcast car Hazelcast n'a pas de dépendances, c'est-à-dire pas de jgroups.jar, etc.
Hazelcast :
Java.util.concurrency.locks.Lock
Découvrez Apache's Zookeeper (Un sous-projet Hadoop) - il offre une synchronisation distribuée. La documentation n'est pas géniale, mais ce qu'elle contient donne un aspect intéressant - consultez les recettes pour des idées sur la façon d'utiliser Zookeeper.
Il est de niveau inférieur à ce que vous souhaiteriez probablement et nécessite un déploiement supplémentaire car il recommande des serveurs dédiés.
Vous pouvez modéliser différentes stratégies de verrouillage et il offre une solution pour un porte-verrou mourant (nœuds éphémères).
Je recommande d'utiliser Redisson c'est un Redis basé sur la grille de données en mémoire. Il implémente des structures de données familières Java incluant les objets distribués Java.util.Lock
Et Java.util.concurrent.ReentrantReadWriteLock
. Incluant la possibilité de configurer bailTime. Lock
exemple d'utilisation:
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();
Prend en charge les fournisseurs de cloud comme Azure et AWS.
ZooKeeper est devenu un standard de facto dans le verrouillage distribué avec l'aide du framework Apache Curator . Découvrez les verrous recettes pour plus d'informations.