Preciso criar um mecanismo \ padrão de bloqueio de objeto recursivo personalizado para um sistema distribuído em C #. Basicamente, eu tenho um sistema com vários nós. Cada nó tem permissões de gravação exclusivas em n- número de partes do estado. O mesmo estado também está disponível no formato somente leitura em pelo menos um outro nó. Algumas gravações / atualizações devem ser atômicas em todos os nós, enquanto outras se tornarão consistentes através de processos de replicação em segundo plano, filas, etc.
Para as atualizações atômicas, estou procurando um padrão ou exemplos que permitam marcar com eficiência um objeto como bloqueado para gravações, para que eu possa distribuir, confirmar, reverter, etc ... Como o sistema possui altos níveis de simultaneidade, eu estou assumindo que precisarei ser capaz de empilhar bloqueios que expirarão ou serão desenrolados quando os bloqueios forem liberados.
As partes da transação ou do sistema de mensagens não são o foco desta pergunta, mas forneci a elas um contexto extra. Com isso dito, fique à vontade para articular quais mensagens você acha que seriam necessárias, se quiser.
Aqui está uma amostra vaga do que eu estava imaginando, embora eu esteja aberto a novas idéias além de implementar produtos totalmente novos
thing.AquireLock(LockLevel.Write);
//Do work
thing.ReleaseLock();
Eu estava pensando em usar métodos de extensão, que podem ser algo como isto
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;
}
Para esclarecer alguns detalhes ...
- Todas as comunicações são TCP / IP usando um protocolo de solicitação / resposta binário
- Não há tecnologias intermediárias, como filas ou bancos de dados
- Não há nó principal central. Nesse caso, o arranjo de bloqueio é definido pelo iniciador do bloqueio e pelo parceiro que atenderá à solicitação com alguma forma de tempo limite para controlar seu comportamento
Alguém tem alguma sugestão?