Kiln Proyecto académico
Procesamiento distribuido de imágenes
Subes un lote, defines transformaciones globales y por imagen, y un grupo de nodos worker lo procesa en paralelo a través de RabbitMQ — con replicación de PostgreSQL y almacenamiento compartido entre cinco máquinas virtuales.
- FastAPI publica una tarea por imagen en RabbitMQ; nodos worker con cuatro hilos cada uno las consumen, procesan y confirman.
- Un PostgreSQL primario con réplica por streaming replication y NFS para los archivos compartidos, desplegado en cinco VMs de VirtualBox — y en Docker Compose.
- Kiln, el cliente web, es JavaScript sin dependencias: constructor de lotes, 11 tipos de transformación, progreso en vivo y descarga en ZIP.


El encargo
Un proyecto de sistemas distribuidos llevado más allá del mínimo: un cliente sube N imágenes, cada una con una lista JSON de transformaciones, y el sistema reparte el trabajo entre nodos, sigue cada tarea y devuelve un ZIP cuando el lote termina.
Usar máquinas reales en lugar de un solo proceso lo volvió interesante: las fallas pueden pasar en cualquier parte y el estado tiene que seguir consistente mientras tanto.
Lo que construí
- API REST para crear lotes (archivos o ZIP), consultar el progreso y descargar resultados
- Nodos worker con pools de hilos configurables que consumen RabbitMQ con ack/nack
- 11 transformaciones: resize, escala de grises, rotación, recorte, flip, desenfoque, nitidez, brillo, contraste, marca de agua y conversión de formato
- Estado de lotes, tareas y nodos en PostgreSQL, replicado a una réplica de solo lectura
- Cliente web Kiln: login con JWT, pasos globales y por imagen, vista previa del JSON, polling y descarga en ZIP
- Limpieza automática de entradas al procesar y de resultados al descargar
Arquitectura
Por dentro
La carga nunca espera a la cola
La API guarda los archivos, registra el lote y publica las tareas en segundo plano, así el cliente recibe el id del lote de inmediato.
Degradar, no caerse
Si RabbitMQ está caído, la API igual arranca y responde a los lotes nuevos con 503 en lugar de fallar al iniciar.
El estado como catálogo
Los estados de lote, tarea, resultado y nodo son tablas de catálogo; los nodos se registran solos y un lote se cierra cuando termina su última tarea.
Replicación para lecturas
La replicación por streaming de WAL mantiene una réplica en caliente de la base de datos en su propia máquina virtual.
Galería




Dónde está hoy
Desplegado en cinco VMs de VirtualBox sobre una red en puente y reproducible con Docker Compose. Las pantallas de esta página vienen de una ejecución local procesando un lote de ocho imágenes.