Dados essenciaisCoordenação

Locks distribuídos

Garanta que só um worker execute um job por vez, com locks que expiram sozinhos e são liberados com segurança pelo dono.

comando para adquirir
1
comando para liberar com segurança
1
scripts Lua
0
Etapa 1 de 5
O worker A pega o lock

NX só o pega se ninguém o tiver. PX 30000 faz com que ele expire em 30 segundos se A morrer.

Sessão de exemploplaying
# O worker A pega o lock
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

Uma demonstração animada com comandos reais do HotKV e respostas de exemplo. Clique em qualquer etapa para ir direto a ela. Os comandos e as respostas ficam em inglês, exatamente como você os digita e vê no HotKV.

O problema

Cron jobs em várias máquinas, capturas de pagamento e reconstruções de cache não podem rodar duas vezes ao mesmo tempo. Um lock sem expiração fica preso para sempre quando o dono cai, e liberar um lock com um DEL simples pode apagar o lock de outra pessoa depois que o seu expirou.

Como o HotKV resolve

SET com NX e PX adquire um lock só se ninguém o tiver, e dá a ele uma expiração para que um dono que caiu não o segure para sempre. Cada dono armazena um token aleatório como valor. DELEX com IFEQ apaga o lock só se ele ainda tiver o seu token, que é a liberação segura que antes exigia um script Lua.

Passo a passo

O que acontece, comando por comando

  1. 01

    O worker A pega o lock

    NX só o pega se ninguém o tiver. PX 30000 faz com que ele expire em 30 segundos se A morrer.

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

    O worker B é recusado

    O lock está ocupado, então B recebe nil e pula esta execução.

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

    A faz o trabalho

    Só um worker executa o job de faturamento.

    PTTL lock:billing-run
  4. 04

    Libere só o seu próprio lock

    DELEX apaga a chave só se o valor ainda for o token de A.

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

    Um token errado não faz nada

    Se A tivesse demorado demais e B estivesse com o lock agora, a liberação de A deixaria o lock de B intacto.

    DELEX lock:billing-run IFEQ tok-stale
Onde se encaixa

Cenários reais

Jobs agendados

O mesmo cron roda em todas as instâncias, e o lock garante que exatamente uma delas faça o trabalho.

Pagamentos

As operações de captura e de reembolso de um pedido são serializadas para nunca se sobreporem.

Proteção contra cache stampede

Só uma requisição reconstrói uma entrada de cache cara, enquanto as outras esperam ou servem o valor antigo.

Integrado

O que você ganha

Aquisição com expiração

SET NX PX pega o lock só se estiver livre, com um timeout.

SETNXPX

Liberação segura

DELEX IFEQ só apaga se o valor corresponder ao seu token.

DELEX

Estenda enquanto trabalha

Verifique o tempo restante e estenda-o em jobs longos.

PTTLPEXPIRE

Comparação por digest

Para valores grandes, DELEX IFDEQ compara um digest em vez do valor inteiro.

DIGESTIFDEQ
Referência:SETDELEXDIGEST

Perguntas frequentes

Por que não simplesmente dar DEL no lock?

Se o seu lock expirou e outro worker o pegou, um DEL simples apagaria o lock dele. DELEX IFEQ só o apaga enquanto ele ainda tiver o seu token.

Qual deve ser a duração da expiração?

Maior do que o tempo que o job costuma levar. Em jobs longos, estenda a expiração periodicamente enquanto ainda estiver com o lock.

Preciso de Lua para uma liberação segura?

Não. DELEX faz a comparação e a exclusão em um comando.

Casos de uso relacionados

Experimente com a sua própria carga de trabalho

O HotKV fala o protocolo Redis, então você pode apontar um cliente existente para ele e executar estes mesmos comandos.