Skip to main content

Worker

El microservicio Worker es el motor de cálculo de alto rendimiento de la plataforma ASPA. Diseñado específicamente para manejar volúmenes masivos de datos, es el responsable de resolver las consultas espaciales complejas y calcular los tiempos de viaje en cuestión de segundos, priorizando una latencia mínima mediante el procesamiento directo en la memoria del servidor.

Funcionalidad

Las responsabilidades principales de este componente abarcan la ejecución de consultas, el cálculo matemático y la generación de archivos físicos:

  • Filtrado de orígenes y destinos: Ejecuta directamente sobre la base de datos PostgreSQL las consultas SQL pre-construidas por el Back Node. De esta forma, el Worker extrae de manera exacta qué celdas de origen y qué equipamientos de destino deben participar en el cálculo.
  • Cálculo de accesibilidad (Top-N): Una vez filtrados los puntos, el sistema cruza los identificadores con una matriz de accesibilidad pre-cargada íntegramente en la memoria RAM. Mediante este cruce, calcula el tiempo exacto de desplazamiento y extrae los N destinos más cercanos para cada punto de origen.
  • Generación de resultados (CSV): Escribe los resultados procesados directamente en el disco duro del servidor en formato CSV. Esta estrategia evita saturar la red transfiriendo archivos de varios gigabytes hacia el Back Node. Durante este proceso, el Worker emite callbacks para notificar el progreso y la finalización exitosa del trabajo al Back Node.
  • Gestión ininterrumpida de datasets: Permite cargar y preprocesar nuevos escenarios de datos (como matrices de días laborales o fines de semana) y realizar el recambio en la memoria RAM de forma atómica, garantizando que el servicio nunca se interrumpa para los usuarios.

Detalles técnicos y arquitectura

A nivel de ingeniería, este microservicio es un servidor HTTP de un solo binario, diseñado bajo premisas de máximo rendimiento y control absoluto de los recursos:

  • Stack tecnológico: Desarrollado íntegramente en C++, sin depender de frameworks pesados, interactuando directamente con PostgreSQL mediante la librería nativa libpq. La compilación está empaquetada y optimizada mediante Docker.
  • Optimización extrema de memoria: Para evitar los cuellos de botella de una base de datos tradicional, la matriz de distancias (compuesta por más de 5.300 millones de celdas y un peso aproximado de 10,5 GB) reside estáticamente en RAM. Se almacena como un array unidimensional plano de números enteros de 16 bits (uint16_t), lo que permite que la búsqueda de tiempos de viaje sea una simple y rapidísima operación de aritmética de punteros de coste constante O(1).
  • Concurrencia y paralelismo real: El cálculo del "Top-N" y la escritura del archivo CSV final se distribuyen a lo largo de todos los núcleos disponibles de la CPU (std::async). Cada hilo de procesamiento trabaja de forma independiente sin bloqueos, aprovechando al máximo la caché del procesador al leer la memoria de forma estrictamente secuencial.
  • Arquitectura modular: A pesar de ser un binario único, el código está estrictamente dividido en capas lógicas: un servidor HTTP ligero, un motor de cálculo (acc_engine), un módulo de conexión a base de datos y un conjunto de utilidades para el procesamiento de archivos CSV. Esto garantiza un mantenimiento sencillo y una alta escalabilidad del código.