Universidad Nacional de Luján
Departamento de Ciencias Básicas
Sistemas Distribuidos y Programación Paralela 2026 Dr. David Petrocelli
TP 2
📑 Índice del documento

Trabajo Práctico Nº 2

Sistemas Distribuidos y Concurrencia

Fecha de entrega: 31/03/2026


Requisitos, consideraciones y formato de entrega


Contenidos del programa relacionados


Práctica

Hit #1 — Tareas remotas en contenedores

Implementen un servidor que resuelva “tareas arbitrarias” empaquetadas como contenedores Docker [DOCKER, MER14]. Conjunto de acciones de diseño y arquitectura que deben respetarse:

Servidor

Servicio tarea

Cliente

Importante (Seguridad): Las credenciales de acceso al registro Docker NO deben enviarse en el payload del request. Como parte de este hit, investigue e implemente una forma segura de autenticar al servidor contra el registro Docker sin exponer credenciales en tránsito (por ejemplo: image pull secrets, tokens de acceso de corta duración, OIDC federation, o configuración previa en el host). Documente la solución elegida y justifique por qué es más segura que enviar usuario y contraseña en el JSON.

Hit #1 - Arquitectura Cliente/Servidor con Tareas Docker


Hit #2 — Concurrencia y exclusión mutua

Modifiquen el servidor del Hit #1 para que acepte múltiples tareas concurrentes. Para ello:

  1. Pool de workers: implementar un pool con un límite configurable (por ejemplo, N workers máximos). Cada worker ejecuta una tarea en un contenedor Docker independiente.
  2. Exclusión mutua: cuando llegan más tareas que workers disponibles, las tareas deben encolarse. Implementen la cola con exclusión mutua para garantizar que no haya race conditions al asignar tareas. Pueden usar un mutex distribuido o implementar el algoritmo de Ricart-Agrawala [RIC81] para el acceso a la cola compartida.
  3. Relojes lógicos: implementen timestamps lógicos (relojes de Lamport) [LAM78] en los mensajes entre cliente y servidor para ordenar las solicitudes de manera consistente.
  4. Medición de throughput: midan y documenten el throughput del sistema (tareas completadas por minuto) variando la cantidad de workers: 1, 2, 4 y 8. Presenten los resultados en una tabla y grafiquen la curva de escalabilidad. Analicen si el speedup es lineal o si hay un cuello de botella — la ley de Amdahl [AMD67] es la herramienta teórica para razonar este límite. Considerando que todo corre en un solo equipo: ¿cuáles son los recursos compartidos que podrían convertirse en cuello de botella (CPU, memoria, I/O de disco, red de Docker, daemon de Docker)? ¿Cómo los identificarían y medirían?

Hit #2 - Pool de Workers con Exclusión Mutua


Hit #3 — Coordinación y tolerancia a fallos

Desplieguen 2 o más instancias del servidor del Hit #1 detrás de un balanceador de carga (pueden usar nginx [NGINX], HAProxy o un load balancer en la nube).

Implementen un mecanismo de elección de líder utilizando el algoritmo Bully [GAR82] para que uno de los nodos actúe como coordinador del sistema. El coordinador será responsable de:

Documenten en el informe: el diagrama de secuencia de una elección de líder, el tiempo de recuperación ante una caída del coordinador, y cómo se redistribuyen las tareas pendientes.

Hit #3 - Elección de Líder (Algoritmo Bully)


Referencias y Bibliografía