AffinityRouter
Enrutamiento inteligente de tareas con localidad de datos para sistemas distribuidos — maximizando aciertos de caché mediante hashing consistente.
🧪 Disclaimer - Prueba de Concepto (PoC): Prototipo en fase inicial. Es funcional, pero se encuentra en constante evolución. No se recomienda su uso en entornos de producción todavía.
Screenshots
Diagrama conceptual de la arquitectura: Balanceador → Middleware → Workers
Resultados de benchmarks mostrando la mejora en la tasa de acierto de caché
Overview
AffinityRouter es una librería de Python para el enrutamiento inteligente de tareas en sistemas distribuidos. En lugar de distribuir el trabajo de manera agnóstica (por ejemplo, Round-Robin), prioriza la Localidad de Datos utilizando hashing consistente, asegurando que las tareas para un mismo recurso siempre lleguen al mismo worker. Esto maximiza los aciertos de caché en memoria y minimiza la carga en la base de datos. La idea principal es sencilla: si el Worker A ya ha procesado una tarea para customer_id=42, es muy probable que los datos de ese cliente sigan en la memoria del Worker A. Enrutar la siguiente tarea para customer_id=42 de vuelta al Worker A significa cero fallos de caché y cero consultas a la base de datos — logrando un rendimiento significativamente mayor a gran escala. AffinityRouter incluye una capa de middleware respaldada por Redis, por lo que tu estrategia de distribución persiste en caso de reinicios y es visible para todos los workers del clúster. El anillo de hashing consistente maneja automáticamente la adición y eliminación de nodos con un remapeo mínimo de claves.
Architecture
AffinityRouter se sitúa entre tu balanceador de carga y tus workers como una ligera capa de middleware. Envío de Tareas: Un cliente envía una tarea con una clave de afinidad (por ejemplo, customer_id, tenant_id, file_id). El AffinityRouter aplica una función hash a esta clave usando hashing consistente para determinar el worker objetivo. Anillo de Hashing Consistente: El anillo mapea el espacio de claves a los nodos worker. Cuando un worker se une o se va, solo se remapean las claves en el arco afectado — no todo el espacio de claves. Esto minimiza las interrupciones durante el escalado. Tabla de Enrutamiento Redis: El estado actual del anillo de hashing se guarda en Redis, permitiendo que todos los enrutadores del clúster compartan la misma vista de qué worker posee qué claves. Procesamiento del Worker: Los workers reciben tareas garantizando la localidad. Si tienen el recurso en memoria, lo sirven directamente; si no, lo obtienen de la base de datos y lo almacenan en caché para peticiones futuras.