Ich muss einen benutzerdefinierten rekursiven Objektsperrmechanismus \ Muster für ein verteiltes System in C # entwickeln. Im Wesentlichen habe ich ein System mit mehreren Knoten. Jeder Knoten verfügt über exklusive Schreibberechtigungen für n- Status-Teile. Der gleiche Status ist auch in schreibgeschützter Form auf mindestens einem anderen Knoten verfügbar . Einige Schreibvorgänge / Aktualisierungen müssen über alle Knoten hinweg atomar sein, während andere Aktualisierungen durch Hintergrundreplikationsprozesse, Warteschlangen usw. konsistent werden.
Für die atomaren Aktualisierungen suche ich nach einem Muster oder Beispielen, mit denen ich ein Objekt effizient als für Schreibvorgänge gesperrt markieren kann , die ich dann verteilen, festschreiben, zurücksetzen usw. kann. Da das System ein hohes Maß an Parallelität aufweist, habe ich Ich gehe davon aus, dass ich in der Lage sein muss, Sperren zu stapeln, die entweder eine Zeitüberschreitung aufweisen oder abgewickelt werden, sobald die Sperren freigegeben werden.
Die Transaktions- oder Messaging-Teile stehen nicht im Mittelpunkt dieser Frage, aber ich habe sie für einen zusätzlichen Kontext bereitgestellt. Wenn dies gesagt ist, können Sie gerne artikulieren, welche Nachrichten Ihrer Meinung nach benötigt werden, wenn Sie möchten.
Hier ist ein vages Beispiel von dem, was ich mir vorgestellt habe, obwohl ich offen für neue Ideen bin, abgesehen von der Implementierung ganz neuer Produkte
thing.AquireLock(LockLevel.Write);
//Do work
thing.ReleaseLock();
Ich dachte darüber nach, Erweiterungsmethoden zu verwenden, die ungefähr so aussehen könnten
public static void AquireLock(this IThing instance, TupleLockLevel lockLevel)
{
//TODO: Add aquisition wait, retry, recursion count, timeout support, etc...
//TODO: Disallow read lock requests if the 'thing' is already write locked
//TODO: Throw exception when aquisition fails
instance.Lock = lockLevel;
}
public static void ReleaseLock(this IThing instance)
{
instance.Lock = TupleLockLevel.None;
}
Um ein paar Details zu klären ...
- Alle Kommunikationen sind TCP / IP unter Verwendung eines binären Anforderungs- / Antwortprotokolls
- Es gibt keine Zwischentechnologien wie Warteschlangen oder Datenbanken
- Es gibt keinen zentralen Masterknoten. In diesem Fall wird die Sperranordnung vom Initiator der Sperre und vom Partner definiert, der die Anforderung mit einer Zeitüberschreitung zur Steuerung ihres Verhaltens berücksichtigt
Hat jemand irgendwelche Vorschläge?