🚀 INSTALL#
Estado: activo Ruta oficial: Docker Compose Uso recomendado: levantar el laboratorio completo por lenguaje o un caso puntual de forma limpia y reproducible
📋 Requisitos#
| Requisito | Comentario |
|---|---|
| Docker Desktop o Docker Engine + Compose | Requisito principal para casos operativos |
| Git | Para clonar el repositorio |
| Terminal Bash-compatible | Opcional; solo si quieres usar el Makefile tal cual |
Notas practicas:
- En Windows, la ruta mas estable es
docker composedirecto. - El
Makefileactual usa/bin/bash, por lo que funciona mejor en WSL, Git Bash o Linux/macOS. - Caso
01PHP consume mas recursos porque incluye PostgreSQL, Prometheus y Grafana.
📦 Clonacion#
git clone https://github.com/vladimiracunadev-create/problem-driven-systems-lab.git
cd problem-driven-systems-lab🧭 Convención: un compose por lenguaje#
Cada lenguaje tiene su propio archivo compose en la raíz. Un solo comando levanta los 20 casos de ese lenguaje. Los stacks son independientes y pueden correr en paralelo.
| Archivo | Lenguaje | Puertos | Estado |
|---|---|---|---|
compose.root.yml | PHP 8.3 | 8080 portal · 8100 PHP hub · 9091 Prometheus · 3001 Grafana | OPERATIVO |
compose.python.yml | Python 3.12 | 8200 Python hub | OPERATIVO |
compose.nodejs.yml | Node.js 22 | 8300 Node hub | OPERATIVO |
compose.java.yml | Java 21 | 8400 Java hub | OPERATIVO |
compose.dotnet.yml | .NET 8 | 8500 .NET hub | OPERATIVO |
compose.go.yml | Go 1.23 | 8600 Go hub | OPERATIVO |
compose.rust.yml | Rust 1.83 | 8700 Rust hub | OPERATIVO |
Topologia de puertos (que levanta cada compose)#
flowchart LR
portal["Portal :8080"]
php["PHP hub :8100"]
py["Python hub :8200"]
node["Node hub :8300"]
java["Java hub :8400"]
net[".NET hub :8500"]
go[["Go hub :8600"]]
rs[["Rust hub :8700"]]
prom["Prometheus :9091"]
graf["Grafana :3001"]
subgraph root["compose.root.yml"]
portal
php
prom
graf
end
subgraph py_compose["compose.python.yml"]
py
end
subgraph node_compose["compose.nodejs.yml"]
node
end
subgraph java_compose["compose.java.yml"]
java
end
subgraph net_compose["compose.dotnet.yml"]
net
end
php -.->|scrape| prom
prom --> graf10 puertos cubren el lab entero: 7 hubs + portal + Prometheus + Grafana.
🐘 Laboratorio PHP completo#
docker compose -f compose.root.yml up -d --buildURLs esperadas:
- Portal:
http://localhost:8080 - PHP hub (todos los casos):
http://localhost:8100/01/…http://localhost:8100/12/ - Prometheus:
http://localhost:9091· Grafana:http://localhost:3001
Para apagar:
docker compose -f compose.root.yml down🐍 Laboratorio Python completo#
docker compose -f compose.python.yml up -d --buildURLs esperadas:
- Python hub:
http://localhost:8200/ - Casos Python:
http://localhost:8200/01/health...http://localhost:8200/12/health
Para apagar:
docker compose -f compose.python.yml down🟢 Laboratorio Node.js completo#
docker compose -f compose.nodejs.yml up -d --buildURLs esperadas:
- Node.js hub:
http://localhost:8300/ - Casos Node.js:
http://localhost:8300/01/health...http://localhost:8300/12/health
Para apagar:
docker compose -f compose.nodejs.yml down☕ Laboratorio Java completo#
docker compose -f compose.java.yml up -d --buildURLs esperadas:
- Java hub:
http://localhost:8400/ - Casos Java:
http://localhost:8400/01/health...http://localhost:8400/12/health
Para apagar:
docker compose -f compose.java.yml down🟦 Laboratorio .NET completo#
docker compose -f compose.dotnet.yml up -d --buildURLs esperadas:
- .NET hub:
http://localhost:8500/ - Casos .NET:
http://localhost:8500/01/health...http://localhost:8500/12/health - Go hub:
http://localhost:8600/ - Casos Go:
http://localhost:8600/01/health...http://localhost:8600/12/health - Rust hub:
http://localhost:8700/ - Casos Rust:
http://localhost:8700/01/health...http://localhost:8700/12/health
Para apagar:
docker compose -f compose.dotnet.yml down🪶 Portal liviano solamente#
docker compose -f compose.portal.yml up -d --buildURL esperada:
- Portal:
http://localhost:8080
Para apagar:
docker compose -f compose.portal.yml down✅ Ejecucion aislada de un solo caso#
Cada caso mantiene su propio compose.yml interno. Util para desarrollo o revision individual sin levantar el stack completo.
Caso 01#
# PHP (con PostgreSQL + Prometheus + Grafana)
docker compose -f cases/01-api-latency-under-load/php/compose.yml up -d --build
# Python (contenedor unico, sin dependencias externas)
docker compose -f cases/01-api-latency-under-load/python/compose.yml up -d --buildURLs esperadas:
- PHP via hub:
http://localhost:8100/01/— Prometheus:http://localhost:9091— Grafana:http://localhost:3001 - Python via hub:
http://localhost:8200/01/
Caso 02#
docker compose -f cases/02-n-plus-one-and-db-bottlenecks/php/compose.yml up -d --build
docker compose -f cases/02-n-plus-one-and-db-bottlenecks/python/compose.yml up -d --buildURLs esperadas:
- PHP via hub:
http://localhost:8100/02/ - Python via hub:
http://localhost:8200/02/
Caso 03 (disponible en tres lenguajes)#
docker compose -f cases/03-poor-observability-and-useless-logs/php/compose.yml up -d --build
docker compose -f cases/03-poor-observability-and-useless-logs/node/compose.yml up -d --build
docker compose -f cases/03-poor-observability-and-useless-logs/python/compose.yml up -d --buildURLs esperadas:
- PHP via hub:
http://localhost:8100/03/ - Node.js (aislado):
http://localhost:823 - Python via hub:
http://localhost:8200/03/
Casos 01, 02, 04, 05 en Node.js (aislados)#
Cada uno se levanta independiente y deja senales Node-especificas (event_loop_lag_ms, process.memoryUsage(), AbortController):
docker compose -f cases/01-api-latency-under-load/node/compose.yml up -d --build # http://localhost:821
docker compose -f cases/02-n-plus-one-and-db-bottlenecks/node/compose.yml up -d --build # http://localhost:822
docker compose -f cases/04-timeout-chain-and-retry-storms/node/compose.yml up -d --build # http://localhost:824
docker compose -f cases/05-memory-pressure-and-resource-leaks/node/compose.yml up -d --build # http://localhost:825🛠️ Atajos con Makefile#
Si tu shell soporta /bin/bash, puedes usar:
make portal-up
make case-up CASE=01-api-latency-under-load STACK=php
make case-up CASE=02-n-plus-one-and-db-bottlenecks STACK=php
make case-up CASE=03-poor-observability-and-useless-logs STACK=php🔎 Verificacion basica#
Recomendado despues de levantar cualquier stack:
# PHP
docker compose -f compose.root.yml ps
# Python
docker compose -f compose.python.yml ps
# Caso aislado
docker compose -f cases/01-api-latency-under-load/php/compose.yml ps
docker compose -f cases/01-api-latency-under-load/php/compose.yml logs --tail=50🧯 Apagado ordenado#
docker compose -f compose.root.yml down
docker compose -f compose.python.yml down
docker compose -f compose.portal.yml down⚖️ Alcance honesto de la instalacion#
- La ruta oficialmente soportada es Docker para los casos implementados.
- PHP, Python y Node.js levantan los 20 casos cada uno con un solo compose en la raiz.
- Java levanta los 20 casos con
compose.java.yml(puerto8400). - .NET levanta los 20 casos con
compose.dotnet.yml(puerto8500). - Go levanta los 20 casos con
compose.go.yml(puerto8600). - Rust levanta los 20 casos con
compose.rust.yml(puerto8700). - Levantar un caso aislado sigue siendo la mejor ruta cuando quieres diagnostico fino o menos consumo de recursos.