Devo trovare un meccanismo di blocco degli oggetti ricorsivo personalizzato \ modello per un sistema distribuito in C #. In sostanza, ho un sistema multi-nodo. Ogni nodo ha autorizzazioni di scrittura esclusive su n- number pezzi di stato. Lo stesso stato è disponibile anche in forma di sola lettura su almeno un altro nodo. Alcune scritture / aggiornamenti devono essere atomici su tutti i nodi, mentre altri aggiornamenti diventeranno coerenti attraverso i processi di replica in background, le code, ecc.
Per gli aggiornamenti atomici sto cercando un modello o campioni che mi consentano in modo efficiente di contrassegnare un oggetto come bloccato per le scritture che posso quindi distribuire, eseguire il commit, il rollback, ecc ... Dal momento che il sistema ha livelli elevati di concorrenza, io Suppongo che dovrò essere in grado di impilare i blocchi che andranno in timeout o verranno srotolati una volta rilasciati i blocchi.
Le transazioni o i messaggi di messaggistica non sono al centro di questa domanda, ma li ho forniti per un contesto aggiuntivo. Detto questo, sentiti libero di articolare quali messaggi pensi che sarebbero necessari se vuoi.
Ecco un vago esempio di ciò che stavo immaginando, anche se sono aperto a nuove idee oltre all'implementazione di nuovi prodotti
thing.AquireLock(LockLevel.Write);
//Do work
thing.ReleaseLock();
Stavo pensando di utilizzare metodi di estensione, che potrebbero assomigliare a questo
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;
}
Per chiarire un paio di dettagli ...
- Tutte le comunicazioni sono TCP / IP mediante un protocollo binario di richiesta / risposta
- Non ci sono tecnologie intermedie come code o database
- Non esiste un nodo principale centrale. In questo caso, la disposizione del blocco è definita dall'iniziatore del blocco e dal partner che onorerà la richiesta con una qualche forma di timeout per governarne il comportamento
Qualcuno ha qualche suggerimento?