🧪 Problem-Driven Systems Lab

🟢 Caso 11 — Reportes pesados que bloquean la operacion#

Implementacion operativa del caso 11 con paridad al stack PHP. Medicion del impacto sobre la operacion via perf_hooks.monitorEventLoopDelay() — la primitiva nativa de Node para detectar bloqueos del loop principal.

⬅️ Caso 11 · ⚖️ Comparativa de los 7 stacks · 🟢 Perfil de Node.js · 🧬 Todos los perfiles

Que resuelve#

Compara dos formas de correr un reporte pesado:

  • report-legacy: ejecuta el volcado en el path critico, bloqueando el event loop con CPU sincronico. La operacion concurrente (/order-write) lo paga: event_loop_lag_ms_p99 sube y la latencia de escritura se degrada.
  • report-isolated: programa el reporte fuera del path critico via setImmediate y lo manda a una "cola" virtual con replica/snapshot, dejando el primary libre.

Escenarios: end_of_month, finance_audit, ad_hoc_export, mixed_peak.

Primitivas Node-especificas#

  • monitorEventLoopDelay({ resolution: 10 }): histograma del lag del event loop, expuesto como p50/p99/max en /metrics y Prometheus. Mide el impacto real, no estimado.
  • En report-legacy, un while (Date.now() < end) {} simula CPU pesado bloqueante — equivalente a un long-running query sin yield. El histograma lo muestra crudo.
  • En report-isolated, await new Promise((r) => setImmediate(r)) cede el control al event loop antes de actualizar la cola, manteniendo /order-write responsivo.

Arranque#

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

Puerto local: 8211 (modo aislado, ver opciones abajo).

Como consumir (dos opciones)#

Hub Node.js (recomendado, 8300 en compose.nodejs.yml): este caso queda servido en http://localhost:8300/11/... junto a los otros 11 casos.

Modo aislado (8211 en este compose.yml): levanta solo este caso, util cuando la medicion necesita procesar limpio (sin otros casos compartiendo runtime).

Endpoints#

bash
curl http://localhost:8300/11/
curl http://localhost:8300/11/health
curl "http://localhost:8300/11/report-legacy?scenario=end_of_month&rows=600000"
curl "http://localhost:8300/11/report-isolated?scenario=end_of_month&rows=600000"
curl "http://localhost:8300/11/order-write?orders=25"
curl "http://localhost:8300/11/activity?limit=10"
curl http://localhost:8300/11/diagnostics/summary
curl http://localhost:8300/11/metrics
curl http://localhost:8300/11/metrics-prometheus
curl http://localhost:8300/11/reset-lab

Que observar#

  • Tras correr report-legacy repetidamente, event_loop_lag_ms_p99 y event_loop_lag_ms_max suben drasticamente;
  • /order-write concurrente registra write_latency_ms mas alto durante la presion legacy;
  • report-isolated mantiene event_loop_lag_ms_p99 cercano al baseline y libera al primary;
  • bajo mixed_peak con rows alto, legacy puede llegar a pressure_level: critical y devolver 503 — el sistema se autoprotege.

Ver esta carpeta en GitHub ↗