Domanda

  

responsabilità : ho già chiesto questa domanda , ma senza la   requisito distribuzione. Ho ottenuto un   risposta che ha ottenuto 3 upvotes, e quando ho   curato la questione di includere il requisito di distribuzione la risposta poi   è diventato irrilevante. Il motivo per cui sono   Reinvio perché ritiene SO   la domanda iniziale 'risposto', anche   se ho avuto alcuna significativa upvoted   risposta. Ho aperto un UserVoice   presentazione su questo problema.   Il motivo per cui è così ripubblicato in StackOverflow considerare la domanda iniziale ha risposto, in modo che non si presenta sulla scheda 'domande senza risposta'.

che ha distribuito il servizio di blocco useresti?

I requisiti sono:

  1. A mutua esclusione (blocco) che può essere visto da diversi processi / macchine
  2. semantica di blocco ... Stampa
  3. rilascio automatico di blocco dopo un certo timeout - se titolare di blocco muore, sarà automaticamente liberato dopo X secondi
  4. implementazione Java
  5. Facile implementazione - non deve richiedere complicata distribuzione al di là sia Netapp, MySql o GigaSpaces. Deve giocare bene con quei prodotti (in particolare GigaSpaces - questo è il motivo per cui in cotto è stato escluso).
  6. Bello avere: implementazione .Net
  7. Se è gratuito: Deadlock detection / attenuazione

Io non sono interessato a risposte come "può essere fatto nel corso di un database", o "può essere fatto su JavaSpaces" - Lo so. risposte competenti dovrebbero contenere solo un pronto, out-of-the-box, provata implementazione.

È stato utile?

Soluzione

Ecco il profilo di una risposta basata GigaSpaces che soddisfa i criteri, a seconda esattamente quello che vuoi dire a criteri 3. io lavoro con GigaSpaces da .Net, Java non è:

Creare una classe di bloccaggio con una proprietà SpaceID + SpaceRouting Iding ciò che è bloccato e una proprietà DataMember bool sbloccato:

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()
    {
    }
}

Si utilizzerà GigaSpaces' tempo di locazione per sblocco dopo un certo tempo scaduto. Questo farà sì che GigaSpaces per rimuovere oggetti IdLockTrans dallo spazio automaticamente dopo che sono rimasto inattivo per il timeout periodo. La mancanza di un IdLockTrans un ID significa che l'ID è sbloccato.

La classe armadietto definirà e inizializzare questi membri della classe

    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.");
        }
    }

Altri suggerimenti

L'implementazione .Net è molto vicino l'esistente dalla serratura scatola / sblocco API fornite con l'API Java. Vedere: http://www.gigaspaces.com/docs/JavaDoc8 .0 / org / spazi all'aperto / core / DefaultGigaMap.html

È possibile trovare il codice sorgente di questa classe Java come parte del file gs-openspaces-src.zip fornito con il prodotto. Avendo lo stesso con GigaSpaces .Net API dovrebbero essere straightfwd.

Nel caso in cui si sta ancora cercando, dare un'occhiata a Apache Zookeeper :

  

ZooKeeper è un servizio centralizzato per mantenere le informazioni di configurazione, denominazione, fornendo la sincronizzazione distribuita, e di fornire servizi di gruppo. Tutti questi tipi di servizi sono utilizzati in un modo o nell'altro per applicazioni distribuite.

La documentazione Zookeeper fornisce esempi di come costruire un servizio di blocco in cima Zookeeper.

Usa mysql per bloccare una chiave unica è molto semplice.

Assunzione 1:

Si utilizza transazione e il tuo livello di isolamento viene letto commesso.

Ipotesi 2: Si blocca si elaborazione filo da una chiave univoca, e rilasciarlo quando impegna la transazione.

Quindi è possibile utilizzare questo SQL come una serratura distribuire:

Inserire nel distributed_lock (chiave)         valori (# {chiave}) ON DUPLICATE chiave KEY UPDATE = chiave;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top