🧪 Problem-Driven Systems Lab

🚀 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#

RequisitoComentario
Docker Desktop o Docker Engine + ComposeRequisito principal para casos operativos
GitPara clonar el repositorio
Terminal Bash-compatibleOpcional; solo si quieres usar el Makefile tal cual

Notas practicas:

  • En Windows, la ruta mas estable es docker compose directo.
  • El Makefile actual usa /bin/bash, por lo que funciona mejor en WSL, Git Bash o Linux/macOS.
  • Caso 01 PHP consume mas recursos porque incluye PostgreSQL, Prometheus y Grafana.

📦 Clonacion#

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

ArchivoLenguajePuertosEstado
compose.root.ymlPHP 8.38080 portal · 8100 PHP hub · 9091 Prometheus · 3001 GrafanaOPERATIVO
compose.python.ymlPython 3.128200 Python hubOPERATIVO
compose.nodejs.ymlNode.js 228300 Node hubOPERATIVO
compose.java.ymlJava 218400 Java hubOPERATIVO
compose.dotnet.yml.NET 88500 .NET hubOPERATIVO
compose.go.ymlGo 1.238600 Go hubOPERATIVO
compose.rust.ymlRust 1.838700 Rust hubOPERATIVO

Topologia de puertos (que levanta cada compose)#

diagrama mermaid
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 --> graf

10 puertos cubren el lab entero: 7 hubs + portal + Prometheus + Grafana.

🐘 Laboratorio PHP completo#

bash
docker compose -f compose.root.yml up -d --build

URLs 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:

bash
docker compose -f compose.root.yml down

🐍 Laboratorio Python completo#

bash
docker compose -f compose.python.yml up -d --build

URLs esperadas:

  • Python hub: http://localhost:8200/
  • Casos Python: http://localhost:8200/01/health ... http://localhost:8200/12/health

Para apagar:

bash
docker compose -f compose.python.yml down

🟢 Laboratorio Node.js completo#

bash
docker compose -f compose.nodejs.yml up -d --build

URLs esperadas:

  • Node.js hub: http://localhost:8300/
  • Casos Node.js: http://localhost:8300/01/health ... http://localhost:8300/12/health

Para apagar:

bash
docker compose -f compose.nodejs.yml down

☕ Laboratorio Java completo#

bash
docker compose -f compose.java.yml up -d --build

URLs esperadas:

  • Java hub: http://localhost:8400/
  • Casos Java: http://localhost:8400/01/health ... http://localhost:8400/12/health

Para apagar:

bash
docker compose -f compose.java.yml down

🟦 Laboratorio .NET completo#

bash
docker compose -f compose.dotnet.yml up -d --build

URLs 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:

bash
docker compose -f compose.dotnet.yml down

🪶 Portal liviano solamente#

bash
docker compose -f compose.portal.yml up -d --build

URL esperada:

  • Portal: http://localhost:8080

Para apagar:

bash
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#

bash
# 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 --build

URLs 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#

bash
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 --build

URLs esperadas:

  • PHP via hub: http://localhost:8100/02/
  • Python via hub: http://localhost:8200/02/

Caso 03 (disponible en tres lenguajes)#

bash
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 --build

URLs 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):

bash
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:

bash
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:

bash
# 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#

bash
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 (puerto 8400).
  • .NET levanta los 20 casos con compose.dotnet.yml (puerto 8500).
  • Go levanta los 20 casos con compose.go.yml (puerto 8600).
  • Rust levanta los 20 casos con compose.rust.yml (puerto 8700).
  • Levantar un caso aislado sigue siendo la mejor ruta cuando quieres diagnostico fino o menos consumo de recursos.

Ver esta carpeta en GitHub ↗