Ho bisogno di creare un meccanismo / meccanismo di blocco degli oggetti ricorsivo personalizzato per un sistema distribuito in C #. Essenzialmente, ho un sistema multi-nodo. Ogni nodo ha permessi esclusivi di scrittura su n - numero di pezzi di stato. Lo stesso stato è disponibile anche nel modulo di sola lettura su almeno un altro nodo. Alcune scritture / aggiornamenti devono essere atomici su tutti i nodi, mentre altri aggiornamenti alla fine diventeranno coerenti attraverso processi di replica in background, code, ecc ...
Per gli aggiornamenti atomici sto cercando un pattern o campioni che consentano in modo efficiente di contrassegnare un oggetto come bloccato per le scritture che posso quindi distribuire, commettere, rollback, ecc ... Dal il sistema ha livelli elevati di concorrenza, presumo che dovrò essere in grado di impilare blocchi che verranno sospesi o srotolati dopo il rilascio dei blocchi.
I pezzi di transazione o di messaggistica non sono al centro di questa domanda, ma li ho forniti per un ulteriore contesto. Detto questo, sentiti libero di articolare i messaggi che ritieni siano necessari se lo desideri.
Ecco un esempio vago di ciò che stavo immaginando anche se sono aperto a nuove idee oltre all'implementazione di nuovi prodotti interi
thing.AquireLock(LockLevel.Write);
//Do work
thing.ReleaseLock();
Stavo pensando di utilizzare i metodi di estensione, che potrebbero essere simili 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 utilizzando un protocollo di richiesta / risposta binario
- Non ci sono tecnologie intermedie come code o database
- Non esiste un nodo principale centrale. In questo caso, la disposizione di blocco è definita dall'iniziatore della serratura e dal partner che onorerà la richiesta con qualche forma di timeout per governarne il comportamento
Qualcuno ha qualche suggerimento?