usar new icon example definicion codigo borderfactory java timeout locking distributed-lock

example - new icon java



Servicio de bloqueo distribuido (6)

¿Qué servicio de bloqueo distribuido usarías?

Los requisitos son:

  1. Una exclusión mutua (bloqueo) que se puede ver desde diferentes procesos / máquinas
  2. bloquear ... liberar semántica
  3. Liberación automática de bloqueo después de un tiempo de espera determinado: si el soporte de la cerradura muere, se liberará automáticamente después de X segundos
  4. Implementación de Java
  5. Es bueno tener: implementación .Net
  6. Si es gratis: detección / mitigación de interbloqueo
  7. Fácil implementación, vea la nota a continuación.

No estoy interesado en respuestas como "se puede hacer a través de una base de datos", o "se puede hacer en JavaSpaces", lo sé. Estoy interesado en una implementación lista, lista para usar, probada.


Consulte Apache''s Zookeeper (un subproyecto de Hadoop): ofrece sincronización distribuida. La documentación no es excelente, pero lo que hay hace que se vea como un producto interesante: revise las recetas para obtener ideas sobre cómo usar Zookeeper.

Es un nivel inferior al que probablemente querría y requiere una implementación adicional, ya que recomienda servidores dedicados.

Puede modelar diferentes estrategias de bloqueo y ofrece una solución para la muerte de un titular de cerradura (nodos efímeros).


Oracle Coherence, que es muy estable y maduro, incluye soporte de exclusión mutua:

cache.lock(key, -1); try { // .. } finally { cache.unlock(key); }

Los bloqueos sobreviven a las fallas del servidor, reinicios continuos, etc.

Por el bien de la divulgación completa, trabajo en Oracle. Las opiniones y opiniones expresadas en este post son mías y no reflejan necesariamente las opiniones o opiniones de mi empleador.


Recomiendo usar Redisson es un Redis basado en la cuadrícula de datos en memoria. Implementa estructuras de datos Java familiares, incluidos los objetos distribuidos java.util.Lock y java.util.concurrent.ReentrantReadWriteLock . Incluyendo la capacidad de configurar leaseTime. Ejemplo de Lock uso:

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();

Admite proveedores de nube como Azure y AWS.


Un niño más nuevo en la cuadra es hazelcast . He estado jugando con eso y es increíblemente fácil de usar y configurar.

Por lo que puedo ver, no debería haber ningún conflicto entre Gigaspaces y hazelcast ya que hazelcast no tiene ninguna dependencia, es decir, no hay jgroups.jar, etc.

Hazelcast :

  1. Una exclusión mutua (bloqueo), sí, implementación de java.util.concurrency.locks.Lock
  2. Liberación automática de bloqueo después de un cierto tiempo de espera, sí, todos los bloqueos se liberan si un miembro abandona el clúster
  3. Implementación de Java, sí
  4. Es bueno tener: implementación de .Net, no es una solución java pura, podría ser posible exportar a j #
  5. Si es gratis: detección / mitigación de interbloqueo, no hay esfuerzo realizado Hazelcast para manejar esto
  6. Fácil implementación, es un solo contenedor con un solo archivo de configuración, implementado como parte de su aplicación, no se requieren procesos adicionales

Teracotta , incluida la edición de código abierto, ha distribuido la semántica de bloqueo mediante synchronized o java.util.concurrent.ReentrantReadWriteLock , que aparentemente cumple con sus requisitos.

Actualizar

Dado que la pregunta ahora agrega el requisito de ''mezclar'' con GigaSpaces, voy a decir que no los mezcle. Simplemente va a agregar más complejidad a su pila tecnológica, y el esfuerzo de:

  • integrando, en términos de código e infraestructura;
  • gestionar la sincronización entre ellos;
  • aprendizaje / ajuste / depuración Teracotta.

se gastará mejor creando o implementando una solución de bloqueo basada en GigaSpaces.


ZooKeeper convirtió en un estándar de facto en el bloqueo distribuido con la ayuda del marco de Apache Curator . Consulte las cerraduras en las recipes para obtener más información.