Muszę wymyślić niestandardowy mechanizm \ wzorca blokowania obiektów rekurencyjnych dla systemu rozproszonego w języku C #. Zasadniczo mam system z wieloma węzłami. Każdy węzeł ma wyłączne uprawnienia do zapisu dla n -liczba elementów stanu. Ten sam stan jest również dostępny w formie tylko do odczytu w co najmniej jednym innym węźle. Niektóre zapisy / aktualizacje muszą być atomowe we wszystkich węzłach, podczas gdy inne aktualizacje w końcu staną się spójne poprzez procesy replikacji w tle, kolejki itp.
W przypadku aktualizacji atomowych szukam wzoru lub próbek, które skutecznie pozwalają mi oznaczyć obiekt jako zablokowany dla zapisów, które mogę następnie rozpowszechniać, zatwierdzać, wycofywać itp. Ponieważ system ma wysoki poziom współbieżności, I Zakładam, że będę musiał układać blokady, które przekroczą limit czasu lub zostaną rozwinięte po zwolnieniu blokad.
Transakcja lub wiadomości nie są przedmiotem tego pytania, ale przedstawiłem je dla dodatkowego kontekstu. Powiedziawszy to, nie krępuj się artykułować, jakie wiadomości według Ciebie będą potrzebne, jeśli chcesz.
Oto niejasna próbka tego, co sobie wyobrażałem, chociaż jestem otwarty na wszelkie nowe pomysły oprócz wdrażania zupełnie nowych produktów
thing.AquireLock(LockLevel.Write);
//Do work
thing.ReleaseLock();
Myślałem o użyciu metod rozszerzenia, które mogą wyglądać mniej więcej tak
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;
}
Aby wyjaśnić kilka szczegółów ...
- Cała komunikacja odbywa się za pomocą protokołu TCP / IP za pomocą binarnego protokołu żądania / odpowiedzi
- Nie ma technologii pośrednich, takich jak kolejki lub bazy danych
- Nie ma centralnego węzła głównego. W takim przypadku mechanizm blokowania jest definiowany przez inicjatora blokady i partnera, który uszanuje żądanie z pewną formą przerwy w zarządzaniu jego zachowaniem
Czy ktoś ma jakieś sugestie?