Frage

  

Hinweis : Ich habe schon gefragt diese Frage , aber ohne die   Bereitstellungsbedarf. Ich habe ein   Antwort, die bekam 3 upvotes, und als ich   bearbeitet die Frage der Bereitstellung Anforderung die Antwort auf umfassen dann   wurde irrelevant. Der Grund, warum ich bin   Erneutes Senden ist, weil so die Auffassung,   die ursprüngliche Frage ‚beantwortet‘, auch   obwohl ich keine sinnvolle bekam upvoted   Antworten. Ich öffnete ein Uservoice   Vorlage über dieses Problem.   Der Grund, warum ich Dritten zugänglich gemacht wird, so Stackoverflow die ursprüngliche Frage beantwortet betrachten, so ist es nicht angezeigt, auf dem ‚offenen Fragen‘ Tab.

Welche lock-Service verteilt würden Sie nutzen?

Die Anforderungen sind:

  1. A gegenseitigen Ausschluss (Sperre), die aus verschiedenen Prozessen zu sehen ist / Maschinen
  2. Schloss ... Release Semantik
  3. Automatische Entriegelung nach einer gewissen Zeit - wenn Schloßhalter stirbt, wird es automatisch nach X Sekunden befreit werden
  4. Java-Implementierung
  5. Einfache Bereitstellung - darf nicht über Stationierung entweder Netapp, MySql oder GigaSpaces kompliziert erfordern. gut spielen muss mit diesen Produkten (vor allem GigaSpaces - deshalb wurde Terrakotta ausgeschlossen).
  6. Nice to have: .NET-Implementierung
  7. Wenn es frei: Deadlock Detection / Milderung

ich in Antworten bin nicht daran interessiert, wie „kann es über eine Datenbank erfolgen“ oder „kann es über Javaspaces getan werden“ - ich weiß. Relevante Antworten sollen nur enthalten bereit, out-of-the-box, bewährte Implementierung.

War es hilfreich?

Lösung

Hier ist der Umriss einer Antwort GigaSpaces basiert, die Ihren Kriterien erfüllt, je nach genau das, was Sie in Kriterien bedeuten 3. Ich mit GigaSpaces von .NET arbeiten, nicht Java:

Erstellen Sie eine Sperrklasse mit einer SpaceID + SpaceRouting Eigenschaft Iding was gesperrt ist und eine Datamember Bool Eigenschaft freigeschaltet:

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

Sie werden GigaSpaces verwenden Lease-Zeit für Entriegelung nach einer bestimmten Auszeit. Dies führt dazu, GigaSpaces IdLockTrans Objekte zu entfernen aus dem Raum automatisch, nachdem sie für die Zeitüberschreitung im Leerlauf gewesen Zeitraum. Das Fehlen eines IdLockTrans für eine ID bedeutet, dass die ID entriegelt wird.

Ihre Spind Klasse definieren und diese Klassenmitglieder initialisieren

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

Andere Tipps

Ihre .NET-Implementierung ist ganz in der Nähe der bestehende aus den Box Sperren / Entsperren API mit dem Java-API zur Verfügung gestellt. Sehen: http://www.gigaspaces.com/docs/JavaDoc8 0,0 / org / Openspaces / core / DefaultGigaMap.html

Sie können den Quellcode für diese Java-Klasse als Teil der gs-openspaces-src.zip Datei zur Verfügung gestellt mit dem Produkt gefunden. Nachdem sollte das gleiche mit GigaSpaces .NET API straightfwd werden.

Falls Sie noch auf der Suche sind, werfen Sie einen Blick auf Apache Zookeeper :

  

ZooKeeper ist ein zentraler Dienst für Konfigurationsinformationen beibehalten, Namensgebung, verteilte Synchronisation bereitstellt, und die Bereitstellung von Gruppendiensten. Alle diese Arten von Dienstleistungen sind in irgendeiner Form oder in anderen von verteilten Anwendungen verwendet wird.

Die Zookeeper Dokumentation enthält Beispiele für wie einen Lock-Service bauen oben auf Zookeeper.

Mit mysql einen eindeutigen Schlüssel zu sperren ist sehr einfach.

Annahme 1:

Sie verwenden Transaktion und Ihre Isolationsstufe lesen verpflichtet.

Annahme 2: Sie sperren Sie Faden durch einen eindeutigen Schlüssel Verarbeitung, und lassen Sie ihn, wenn Sie Ihre Transaktion festgeschrieben.

Dann können Sie diese SQL als verteilen Sperre verwenden:

Einfügen in distributed_lock (key)         Werte (# {key}) ON DUPLICATE KEY UPDATE key = Taste;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top