Datos básicosCoordinación

Bloqueos distribuidos

Asegúrate de que solo un worker ejecuta un trabajo a la vez, con bloqueos que caducan solos y que su propietario libera de forma segura.

comando para adquirir
1
comando para liberar de forma segura
1
scripts de Lua
0
Paso 1 de 5
El worker A toma el bloqueo

NX lo toma solo si nadie lo tiene. PX 30000 hace que caduque en 30 segundos si A muere.

Sesión de ejemploplaying
# El worker A toma el bloqueo
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

Un recorrido animado con comandos reales de HotKV y respuestas de ejemplo. Haz clic en cualquier paso para saltar a él. Los comandos y las respuestas se quedan en inglés, tal como los escribes y los ves en HotKV.

El problema

Los cron jobs en varias máquinas, las capturas de pagos y las reconstrucciones de caché no deben ejecutarse dos veces a la vez. Un bloqueo sin caducidad queda retenido para siempre cuando su propietario falla, y liberar un bloqueo con un simple DEL puede borrar el bloqueo de otro después de que el tuyo haya caducado.

Cómo lo resuelve HotKV

SET con NX y PX adquiere un bloqueo solo si nadie lo tiene, y le da una caducidad para que un propietario caído no pueda retenerlo para siempre. Cada propietario guarda un token aleatorio como valor. DELEX con IFEQ borra el bloqueo solo si todavía contiene tu token, que es la liberación segura que antes requería un script de Lua.

Paso a paso

Qué ocurre, comando a comando

  1. 01

    El worker A toma el bloqueo

    NX lo toma solo si nadie lo tiene. PX 30000 hace que caduque en 30 segundos si A muere.

    SET lock:billing-run tok-a81f NX PX 30000
  2. 02

    El worker B queda fuera

    El bloqueo está tomado, así que B recibe nil y se salta esta ejecución.

    SET lock:billing-run tok-b22c NX PX 30000
  3. 03

    A hace el trabajo

    Solo un worker ejecuta el trabajo de facturación.

    PTTL lock:billing-run
  4. 04

    Libera solo tu propio bloqueo

    DELEX borra la clave solo si el valor sigue siendo el token de A.

    DELEX lock:billing-run IFEQ tok-a81f
  5. 05

    Un token equivocado no hace nada

    Si A hubiera ido demasiado lento y B tuviera ahora el bloqueo, la liberación de A dejaría intacto el bloqueo de B.

    DELEX lock:billing-run IFEQ tok-stale
Dónde encaja

Escenarios reales

Trabajos programados

El mismo cron se ejecuta en todas las instancias, y el bloqueo garantiza que exactamente una de ellas haga el trabajo.

Pagos

Las operaciones de captura y reembolso de un pedido se serializan para que nunca se solapen.

Protección contra cache stampede

Solo una solicitud reconstruye una entrada de caché costosa mientras las demás esperan o sirven el valor antiguo.

Integrado

Qué obtienes

Adquisición con caducidad

SET NX PX toma el bloqueo solo si está libre, con un tiempo de espera.

SETNXPX

Liberación segura

DELEX IFEQ borra solo si el valor coincide con tu token.

DELEX

Prolonga mientras trabajas

Comprueba el tiempo restante y prolóngalo en trabajos largos.

PTTLPEXPIRE

Comparación por digest

Para valores grandes, DELEX IFDEQ compara un digest en lugar del valor completo.

DIGESTIFDEQ
Referencia:SETDELEXDIGEST

Preguntas frecuentes

¿Por qué no hacer simplemente DEL del bloqueo?

Si tu bloqueo caducó y otro worker lo tomó, un simple DEL borraría su bloqueo. DELEX IFEQ solo lo borra mientras todavía contiene tu token.

¿Cuánto debe durar la caducidad?

Más de lo que tarda normalmente el trabajo. En trabajos largos, prolonga la caducidad periódicamente mientras sigas teniendo el bloqueo.

¿Necesito Lua para una liberación segura?

No. DELEX hace la comparación y el borrado en un solo comando.

Casos de uso relacionados

Pruébalo con tu propia carga de trabajo

HotKV habla el protocolo de Redis, así que puedes apuntar un cliente que ya usas hacia él y ejecutar estos mismos comandos.