Мне нужно придумать собственный механизм рекурсивной блокировки объектов \ шаблон для распределенной системы в C #. По сути, у меня есть многоузловая система. Каждый узел имеет эксклюзивные разрешения на запись для n-го числа состояний. Такое же состояние также доступно в форме только для чтения, по крайней мере, на одном другом узле. Некоторые записи / обновления должны быть атомарными во всех узлах, в то время как другие обновления в конечном итоге станут согласованными в процессе фоновой репликации, очередях и т. Д.
Для атомарных обновлений я ищу шаблон или образцы, которые позволят мне пометить объект как заблокированный для записи, который я затем смогу распространять, фиксировать, выполнять откат и т. Д. Так как система имеет высокий уровень параллелизма, я Я предполагаю, что мне нужно будет иметь возможность наращивать блокировки, которые будут либо превышены по времени, либо будут развернуты после снятия блокировок.
Части транзакций или сообщений не являются предметом этого вопроса, но я предоставил их для некоторого дополнительного контекста. С учетом сказанного, не стесняйтесь сформулировать, какие сообщения, по вашему мнению, будут необходимы, если хотите.
Вот расплывчатый образец того, что я представлял, хотя я открыт для любых новых идей, кроме реализации целых новых продуктов
thing.AquireLock(LockLevel.Write);
//Do work
thing.ReleaseLock();
Я думал об использовании методов расширения, которые могут выглядеть примерно так
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;
}
Чтобы уточнить пару деталей ...
- Все коммуникации осуществляются по протоколу TCP / IP с использованием протокола двоичного запроса / ответа.
- Нет промежуточных технологий, таких как очереди или базы данных
- Центрального главного узла нет. В этом случае механизм блокировки определяется инициатором блокировки и партнером, который выполнит запрос с некоторой формой тайм-аута для управления его поведением.
У кого-нибудь есть предложения?