Pregunta

  

Aviso Legal : Ya pregunté esta pregunta , pero sin la   requisito de despliegue. tengo un   respuesta que dieron 3 upvotes, y cuando   editado la cuestión de incluir el requisito de implementación de la respuesta, entonces   se convirtió en irrelevante. La razón por la que estoy   volver a presentar es porque considera SO   la pregunta original 'respondió', incluso   aunque no tengo significativa upvoted   responder. Abrí una uservoice    presentación sobre este problema.   La razón por la que se volvió a publicar de manera stackoverflow considerar la pregunta original respondió, por lo que no aparece en la pestaña '' preguntas sin respuesta.

¿Qué servicio distribuido bloqueo usaría?

Los requisitos son:

  1. A exclusión mutua (bloqueo) que se puede ver a partir de diferentes procesos / máquinas
  2. semántica de bloqueo de liberación ...
  3. liberación de bloqueo automático después de un cierto tiempo de espera - si es que tenga el bloqueo muere, automáticamente se liberará después de X segundos
  4. implementación de Java
  5. Fácil despliegue - no debe requerir el despliegue complicado más allá de cualquiera Netapp, MySQL o GigaSpaces. Debe jugar bien con esos productos (especialmente GigaSpaces - esta es la razón de terracota fue descartado).
  6. Es bueno tener: aplicación .Net
  7. Si es gratis: Punto muerto detección / mitigación

No estoy interesado en respuestas como "se puede hacer sobre una base de datos", o "se puede hacer sobre JavaSpaces" - que conozco. respuestas pertinentes sólo deben contener una, fuera de la caja, cuya implementación es ya probada.

¿Fue útil?

Solución

Aquí está el contorno de una respuesta basada GigaSpaces que cumple con sus criterios, dependiendo de exactamente lo que quiere decir en los criterios con los que trabajo 3. GigaSpaces de .Net, Java no:

Crea una clase de bloqueo con una propiedad SpaceId + SpaceRouting Iding lo que está bloqueada y una propiedad DataMember bool desbloqueado:

sealed public class IdLockTrans
{
    [SpaceID]
    [SpaceRouting]
    public string ID
    {
        get;
        set;
    }

    [DataMember]
    public bool Unlocked
    {
        get;
        set;
    }

    public IdLockTrans(Id id)
    {
        ID = id.ID;
    }

    public IdLockTrans()
    {
    }
}

Utilizará tiempo de concesión GigaSpaces' para la liberación del bloqueo después de un cierto se acabó el tiempo. Esto hará que GigaSpaces para eliminar objetos IdLockTrans desde el espacio automáticamente después de haber estado inactivo durante el tiempo de espera período. La falta de un IdLockTrans para un ID significa que el ID es desbloqueado.

Su clase casillero definir e inicializar estos miembros de la clase

    private readonly ISpaceProxy _proxy;
    private readonly long _leaseTime;

    public override bool Lock(Id id, long timeout)
    {
        bool locked;
        IdLockTrans lockTransTemplate = new IdLockTrans(id);
        // Assume that this is a new id.
        try
        {
            _proxy.Write(lockTransTemplate, null, _leaseTime, 0, UpdateModifiers.WriteOnly);
            locked = true;
        }
        catch (EntryAlreadyInSpaceException)
        {
            using (ITransaction tx = _proxy.CreateLocalTransaction())
            {
                try
                {
                    lockTransTemplate.Unlocked = true;
                    IdLockTrans lockTrans = _proxy.Take(lockTransTemplate, tx, timeout);
                    locked = (lockTrans != null);
                    if (lockTrans != null)
                    {
                        lockTrans.Unlocked = false;
                        _proxy.Write(lockTrans, tx, _leaseTime, 0, UpdateModifiers.WriteOnly);
                    }
                    tx.Commit();
                }
                catch
                {
                    tx.Abort();
                    throw;
                }
            }
        }
        return locked;
    }

    public override void Unlock(Id lockedId)
    {
        IdLockTrans lockTrans = new IdLockTrans(lockedId);
        lockTrans.Unlocked = true;
        try
        {
            _proxy.Update(lockTrans, null, _leaseTime, 0, UpdateModifiers.UpdateOnly);
        }
        catch (EntryNotInSpaceException)
        {
            throw new Exception("IdLockTrans for " + lockTrans.ID
                + " not found on Unlock. Lock time exceeded lease time.");
        }
    }

Otros consejos

Su aplicación .Net está muy cerca de la existente fuera de la caja de bloqueo desbloquear API / suministrado con el API de Java. Ver: http://www.gigaspaces.com/docs/JavaDoc8 0,0 / org / Openspaces / core / DefaultGigaMap.html

Es posible que se encuentra el código fuente de esta clase de Java como parte del archivo gs-openspaces-src.zip proporcionada con el producto. Habiendo lo mismo con la API GigaSpaces .Net debe straightfwd.

En caso de que todavía está buscando, echar un vistazo a Apache Zookeeper :

  

ZooKeeper es un servicio centralizado para el mantenimiento de la información de configuración, denominación, proporcionando sincronización distribuida, y la prestación de servicios de grupo. Todos estos tipos de servicios se utilizan de una forma u otra por las aplicaciones distribuidas.

La documentación Zookeeper proporciona ejemplos de cómo construir un servicio de bloqueo en la parte superior del Zookeeper.

El uso de mysql para bloquear una clave única es muy simple.

Supuesto 1:

Se utiliza transacción y su nivel de aislamiento es de lectura confirmada.

Supuesto 2: Que se bloquea el procesamiento de hilo por una clave única, y lo liberan cuando su transacción comprometida.

A continuación, puede utilizar este sql como un bloqueo distribuir:

Insertar en distributed_lock (llave)         valores (# {key}) ON DUPLICATE actualización de la clave CLAVE = clave;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top