Saltar al contenido principal

Coordinación distribuida en .NET

La coordinación es cómo procesos independientes acuerdan quién hace qué, en qué orden y quién está al mando — sin pisarse unos a otros. Este artículo explica los problemas de coordinación con los que se topan las aplicaciones .NET distribuidas y las primitivas que Clustron proporciona para resolverlos.

Por qué la coordinación es difícil​

Cuando un proceso hace todo el trabajo, el orden y la propiedad son gratis: solo hay un actor. Ejecuta el mismo código como varias instancias y esa garantía desaparece. Dos instancias pueden ahora intentar el mismo trabajo a la vez, leer copias obsoletas del estado compartido, o ambas creerse el líder tras un contratiempo de red. Si no se resuelven, estos problemas se manifiestan como:

  • Condiciones de carrera, cuando dos instancias mutan el mismo recurso de forma concurrente.
  • Estado inconsistente, cuando las instancias actúan sobre vistas diferentes de los datos.
  • Procesamiento duplicado, cuando más de una instancia ejecuta un trabajo que debería ejecutarse una sola vez.
  • Split-brain, cuando una partición deja a dos instancias actuando cada una como la única autoridad.

Las primitivas de coordinación son los bloques de construcción probados que previenen estos resultados, para que no las reimplementes por aplicación.

Primitivas de coordinación​

Las primitivas de abajo son el vocabulario común de la coordinación distribuida. Cada una resuelve uno de los modos de fallo anteriores.

PrimitivaQué garantizaUso típico
Lock distribuidoSolo un poseedor ejecuta una sección a la vezPrevenir la ejecución duplicada de un trabajo; proteger una sección crítica
Elección de líderUn grupo acuerda un único nodo coordinadorEjecutar un planificador singleton; asignar trabajo desde un solo lugar
TransacciónUn conjunto de operaciones se aplica atómicamente, todas o ningunaActualizaciones de múltiples claves que no deben aplicarse parcialmente
Notificación de watchSe avisa a los clientes cuando el estado cambia, en lugar de hacer pollingReaccionar a cambios de configuración o estado en tiempo real

Cómo Clustron proporciona coordinación​

Clustron divide la coordinación en dos capas de su familia de productos, de modo que puedes usar la capa que coincide con tu problema.

La coordinación a nivel de clúster viene de Clustron Nodus. Nodus es el núcleo de clustering y mensajería: los procesos se unen a un clúster entre pares, eligen un líder mediante estrategias conectables, detectan fallos de pares e intercambian mensajes tipados — sin un coordinador externo como ZooKeeper o etcd que operar. La elección de líder y la detección de fallos viven aquí.

La coordinación del plano de datos viene de Clustron Zaris. Zaris es el almacén clave-valor distribuido. Sobre el estado compartido expone locks distribuidos, contadores atómicos, transacciones, notificaciones de watch y leases. Estas se construyen sobre las propias claves, el TTL y el ciclo de vida de los leases del almacén, de modo que un lock se libera automáticamente cuando su propietario muere, y un watch se dispara sin un bucle de polling.

Los dos encajan juntos: Zaris forma clúster sobre Nodus, de modo que un despliegue de Zaris ya tiene membresía y elección de líder por debajo de sus primitivas de datos. Si solo necesitas coordinación de clúster — un planificador solo-líder, un distribuidor de trabajo — usa Nodus directamente. Si necesitas estado compartido y los locks y watches que lo protegen, usa Zaris.

nota

La elección de líder es una capacidad de Nodus. Cuando ejecutas Zaris, la obtienes como parte del clúster por debajo de tu almacén; no levantas un sistema de elección separado.

Dado que estas primitivas se incorporan dentro de las mismas bibliotecas .NET que tu acceso a datos, puedes construir flujos de trabajo distribuidos, sistemas de procesamiento en segundo plano y coordinación de microservicios sin introducir un servicio de coordinación separado.

Próximos pasos​