example - new icon java
Servicio de bloqueo distribuido (6)
¿Qué servicio de bloqueo distribuido usarías?
Los requisitos son:
- Una exclusión mutua (bloqueo) que se puede ver desde diferentes procesos / máquinas
- bloquear ... liberar semántica
- 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
- Implementación de Java
- Es bueno tener: implementación .Net
- Si es gratis: detección / mitigación de interbloqueo
- 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 :
- Una exclusión mutua (bloqueo), sí, implementación de
java.util.concurrency.locks.Lock
- 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
- Implementación de Java, sí
- Es bueno tener: implementación de .Net, no es una solución java pura, podría ser posible exportar a j #
- Si es gratis: detección / mitigación de interbloqueo, no hay esfuerzo realizado Hazelcast para manejar esto
- 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.