Necesito un mecanismo de bloqueo de objetos recursivos personalizado \ patrón para un sistema distribuido en C #. Básicamente, tengo un sistema de múltiples nodos. Cada nodo tiene permisos de escritura exclusivos sobre n -número de piezas de estado. El mismo estado también está disponible en forma de solo lectura en al menos otro nodo. Algunas escrituras / actualizaciones deben ser atómicas en todos los nodos, mientras que otras actualizaciones eventualmente se volverán consistentes a través de procesos de replicación en segundo plano, colas, etc.
Para las actualizaciones atómicas, estoy buscando un patrón o muestras que me permitan marcar de manera eficiente un objeto como bloqueado para escrituras que luego pueda distribuir, confirmar, revertir, etc. Como el sistema tiene altos niveles de concurrencia, yo Supongo que tendré que ser capaz de acumular bloqueos que se agotarán o se desenrollarán una vez que se liberen los bloqueos.
La transacción o las piezas de mensajería no son el foco de esta pregunta, pero las proporcioné para un contexto adicional. Dicho esto, siéntase libre de articular qué mensajes cree que serían necesarios si lo desea.
Aquí hay una muestra vaga de lo que estaba imaginando, aunque estoy abierto a cualquier idea nueva además de implementar productos completamente nuevos.
thing.AquireLock(LockLevel.Write);
//Do work
thing.ReleaseLock();
Estaba pensando en usar métodos de extensión, que podrían verse más o menos así
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 aclarar un par de detalles ...
- Todas las comunicaciones son TCP / IP utilizando un protocolo binario de solicitud / respuesta
- No existen tecnologías intermedias como colas o bases de datos.
- No hay un nodo maestro central. En este caso, la disposición de bloqueo está definida por el iniciador de la cerradura y el socio que atenderá la solicitud con algún tipo de tiempo de espera para regular su comportamiento
¿Alguien tiene alguna sugerencia?