Cuando varios trabajadores comparten un grupo a través de Redis, un conjunto ordenado puede implementar una política sencilla: elegir el proxy elegible con menos asignaciones registradas. Guarde el identificador del proxy como miembro y su contador de asignaciones como puntuación.

Para un grupo que atiende solicitudes públicas permitidas, la lista de proxies gratuitos puede aportar candidatos de extremo que evaluar según las reglas de elegibilidad de ese grupo. Inicialice los miembros elegibles con un contador inicial acordado. Después haga la selección y el incremento en una sola operación del 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

Pase la clave del conjunto ordenado como único argumento de clave del script mediante la interfaz EVAL de su cliente Redis. Un grupo vacío produce un resultado nulo que la aplicación debe manejar sin realizar una solicitud.

¿Por qué combinar los dos comandos?

Las lecturas e incrementos separados permiten que dos trabajadores observen el mismo mínimo antes de que cualquiera lo actualice. Redis ejecuta un script Lua de forma atómica, así que otro trabajador no puede insertar una selección entre la lectura y el incremento de este script. Mantenga el script breve porque su ejecución bloquea otro trabajo de Redis.

ZRANGE devuelve primero la puntuación más baja; las puntuaciones iguales se resuelven por el orden de los miembros, no al azar. ZINCRBY sube en uno la puntuación del miembro elegido para la siguiente asignación.

Defina qué significa la puntuación

Esto cuenta asignaciones, incluida una asignación cuya solicitud de red falla después. No mide latencia, solicitudes exitosas ni trabajo en curso. Sigue siendo posible elegir repetidamente el único miembro elegible; el script no lo reserva en exclusiva.

Mantenga la elegibilidad con las reglas de salud y política del grupo. Si retira un miembro y luego lo restaura, decida si debe conservarse su contador histórico. Empezar un proxy restaurado en cero puede concentrar en él las asignaciones mientras se pone al día.

Una política de menor concurrencia necesita otro ciclo de vida, incluida la finalización y el manejo de tareas abandonadas. No interprete este contador acumulativo como ese ciclo de vida.

Artículos relacionados