Quando vários workers compartilham um pool através do Redis, um conjunto ordenado pode implementar uma política simples: escolher o proxy elegível com menos alocações registradas. Armazene o identificador do proxy como membro e a contagem das suas alocações como pontuação.

Para um pool que atende pedidos públicos permitidos, a lista de proxies gratuitos pode fornecer candidatos de endpoint a avaliar segundo as regras de elegibilidade desse pool. Inicialize os membros elegíveis com uma contagem inicial acordada. Depois torne a seleção e o incremento uma única operação do lado do servidor:

local chosen = redis.call('ZRANGE', KEYS[1], 0, 0)[1]
if not chosen then
    return nil
end

redis.call('ZINCRBY', KEYS[1], 1, chosen)
return chosen

Passe a chave do conjunto ordenado como único argumento de chave do script através da interface EVAL do seu cliente Redis. Um pool vazio produz um resultado nulo que a aplicação tem de tratar sem fazer um pedido.

Porquê combinar os dois comandos?

Leituras e incrementos separados permitem que dois workers observem o mesmo mínimo antes de qualquer um o atualizar. O Redis executa um script Lua de forma atómica, por isso outro worker não pode inserir uma seleção entre a leitura e o incremento deste script. Mantenha o script curto porque a sua execução bloqueia outro trabalho do Redis.

O ZRANGE devolve primeiro a pontuação mais baixa; pontuações iguais são resolvidas pela ordem dos membros, não aleatoriamente. O ZINCRBY sobe em uma a pontuação do membro escolhido para a próxima alocação.

Defina o que significa a pontuação

Isto conta alocações, incluindo uma alocação cujo pedido de rede falha mais tarde. Não mede latência, pedidos bem-sucedidos nem trabalho em curso. Continua a ser possível escolher repetidamente o único membro elegível; o script não o reserva em exclusivo.

Mantenha a elegibilidade com as regras de saúde e de política do pool. Se remover um membro e depois o restaurar, decida se a contagem histórica deve ser mantida. Começar um proxy restaurado em zero pode concentrar nele as alocações enquanto recupera.

Uma política de menor concorrência precisa de outro ciclo de vida, incluindo conclusão e tratamento de tarefas abandonadas. Não interprete este contador cumulativo como esse ciclo de vida.

Artigos relacionados