Caerus LogoCaerusDocs

Distributed Locking Service (DLS)

System Engine

Sincronización a bajo nivel y exclusión mutua distribuida para microservicios. Evita condiciones de carrera, doble facturación y escritura concurrente en almacenamiento compartido.

Signature
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:

EXCLUSIVE (Escritura)
Garantiza exclusión total. Solo un worker puede poseer el lock a la vez. Cualquier otro intento de adquisición exclusiva o compartida queda bloqueado o rechazado.
SHARED_READ (Lectura)
Múltiples workers pueden poseer el lock en simultáneo para tareas de solo lectura, impidiendo que entre un escritor exclusivo hasta que todos los lectores terminen.

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.

Garantía de Secuencia Monótona (Consenso Distribuido)

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

dls-worker.tstypescript
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 finally
8await dls.withTransaction(async (tx) => {
9 // Adquirir lock exclusivo con Fencing Token
10 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 token
20 await procesarFacturacion({
21 fencingToken: lock.fencingToken,
22 });
23}, { timeoutMs: 15000 });
Especificación gRPC de bajo nivel

Consulta los contratos proto3 completos de BeginTransaction, AcquireLock (server streaming), ReleaseLock y GetTransactionStatus en Python, Rust, C#, Ruby o cualquier otro lenguaje.

Ver Contratos Protobuf

¿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.