Distributed Locking Service (DLS)
System EngineSincronización a bajo nivel y exclusión mutua distribuida para microservicios. Evita condiciones de carrera, doble facturación y escritura concurrente en almacenamiento compartido.
const lock = await tx.acquireLock(namespace, key, 'EXCLUSIVE', options);¿Qué es DLS y para qué sirve?
Mientras que el SRE está enfocado en inventario de negocio (butacas, cupos), el Distributed Locking Service (DLS) está diseñado para la sincronización entre procesos. Por ejemplo, garantizar que un worker programado que genera reportes financieros o cobra suscripciones mensuales corra en una sola instancia a la vez.
Modos de Bloqueo: Exclusive vs Shared Read
DLS soporta el patrón de concurrencia Read/Write Locks:
Fencing Tokens contra Split-Brain y Pausas de GC
En sistemas distribuidos, un distributed lock básico no es suficiente. Si un proceso sufre una pausa prolongada de Garbage Collection (GC) o latencia de red, su lock puede vencer en el servidor mientras el proceso cree que todavía lo tiene. Al despertar, podría escribir datos corruptos pisando al nuevo dueño legítimo del lock.
Caerus genera un Fencing Token: un número entero estrictamente incremental (otorgado mediante consenso distribuido garantizado) junto a cada adquisición exitosa. Al escribir en tu base de datos o almacenamiento, verificas que el token sea mayor al último aceptado; si el proceso se quedó dormido, su token viejo será rechazado inmediatamente.
Detección y Resolución Automática de Deadlocks
Cuando múltiples microservicios adquieren recursos en distinto orden (e.g. Worker A tiene el Recurso 1 y espera el Recurso 2, mientras Worker B tiene el Recurso 2 y espera el Recurso 1), se produce un bloqueo mutuo o Deadlock.
El motor de Caerus mantiene un grafo dirigido de dependencias (Wait-For Graph). En cuanto detecta un ciclo cerrado, aplica automáticamente la resolución configurada: aborta a la víctima (el proceso con menor prioridad o menor antigüedad en la transacción) y emite un evento/webhook para que los demás puedan continuar.
Ejemplo de Uso con el SDK
1import { Dls } from '@caerus-dev/sdk';2 3const dls = new Dls.DlsClient({4 apiKey: process.env.CAERUS_API_KEY!,5});6 7// withTransaction orquesta la transacción, heartbeat automático y liberación en finally8await dls.withTransaction(async (tx) => {9 // Adquirir lock exclusivo con Fencing Token10 const lock = await tx.acquireLock(11 'billing-jobs',12 'monthly-billing-job',13 'EXCLUSIVE',14 { timeoutMs: 10000 }15 );16 17 console.log('Lock adquirido. Fencing Token:', lock.fencingToken);18 19 // Ejecutar tarea crítica pasando el fencing token20 await procesarFacturacion({21 fencingToken: lock.fencingToken,22 });23}, { timeoutMs: 15000 });Consulta los contratos proto3 completos de BeginTransaction, AcquireLock (server streaming), ReleaseLock y GetTransactionStatus en Python, Rust, C#, Ruby o cualquier otro lenguaje.
¿Listo para probar el motor DLS?
Simula locks distribuidos, transacciones cruzadas y resolución de deadlocks directamente en el Playground interactivo o clona el proyecto de microservicios de referencia en GitHub.