Camilo Castro
Todo el trabajoCaso 04 / 05

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.
Cliente
Proyecto de curso — Universidad Pontificia Bolivariana
Rol
Diseño e implementación
Año
2026 Académico · código abierto
Tecnologías
  • Python
  • FastAPI
  • RabbitMQ
  • PostgreSQL
  • NFS
  • Docker Compose
  • VirtualBox
  • Vanilla JS
Constructor de lotes de Kiln: ocho fotos cargadas a la izquierda y una pila de transformaciones globales — resize, contrast, sharpen, watermark, convert — a la derecha.
Detalle del lote después del proceso: 8 de 8 imágenes completadas, progreso al 100% y botón para descargar el 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

Kilncliente web · JWT
REST
FastAPIvm-api · uvicorn
AMQP
RabbitMQuna tarea por imagen
tareas
Worker 14 hilos
Worker 24 hilos
SQL · NFSSQL · NFS
PostgreSQLprimario · vm-db
WAL
Réplicasolo lectura
NFSalmacenamiento compartido
Diagrama: el cliente Kiln llama por REST a FastAPI, que publica tareas en RabbitMQ; dos workers de cuatro hilos las consumen. API y workers usan PostgreSQL, replicado por WAL a una réplica de solo lectura, y almacenamiento compartido por NFS.

Por dentro

  1. 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.

  2. 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.

  3. 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.

  4. 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.