web-dev-qa-db-fra.com

Service de verrouillage distribué

Quel service de verrouillage distribué utiliseriez-vous?

Les exigences sont:

  1. Une exclusion mutuelle (verrou) qui peut être vue à partir de différents processus/machines
  2. verrouiller ... libérer la sémantique
  3. Déverrouillage automatique après un certain délai - si le support de verrouillage meurt, il sera automatiquement libéré après X secondes
  4. Implémentation Java
  5. Agréable d'avoir: mise en œuvre .Net
  6. Si c'est gratuit: détection/atténuation de l'impasse
  7. Déploiement facile, voir la note ci-dessous.

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.

54
ripper234

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:

  • l'intégration, en termes de code et d'infrastructure;
  • gérer la synchronisation entre eux;
  • apprentissage/réglage/débogage Teracotta.

sera mieux dépensé pour créer ou implémenter une solution de verrouillage basée sur GigaSpaces.

13
Robert Munteanu

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 :

  1. Une exclusion mutuelle (verrou), yep implémentation de Java.util.concurrency.locks.Lock
  2. Déverrouillage automatique des verrous après un certain délai, yep tous les verrous sont libérés si un membre quitte le cluster
  3. Implémentation Java, oui
  4. Agréable: l'implémentation .Net, non est une pure Java, il pourrait être possible de porter sur j #
  5. Si c'est gratuit: détection/atténuation de blocage, non, aucun effort n'est fait pour ma Hazelcast pour gérer cela
  6. Déploiement facile, c'est un seul pot avec un seul fichier de configuration, déployé dans le cadre de votre application, aucun processus supplémentaire n'est requis
22
Gareth Davis

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).

13
Steven Dick

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.

6
Nikita Koksharov

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.

2
frail