🟢 Caso 07 — Modernizacion incremental de monolito#
Implementacion operativa del caso 07 con paridad al stack PHP. Strangler implementado como
Map<consumer, handler>mutable en runtime — la primitiva mas directa de Node para mover trafico gradualmente sin redeploy.
⬅️ Caso 07 · ⚖️ Comparativa de los 7 stacks · 🟢 Perfil de Node.js · 🧬 Todos los perfiles
Que resuelve#
Compara dos formas de hacer un cambio sobre el sistema:
change-legacy: cambio sobre la "god class" acoplada. Cualquier desalineacion (esquema compartido, conflicto de ramas) explota con stacktrace en multiples modulos.change-strangler: el mismo cambio aplicado contra el modulo extraido, registrado en una tabla de routing. Avance del consumidor en+25%, ACL via closure que filtra contrato.
Escenarios: billing_change, shared_schema, parallel_conflict. Consumers: web, mobile, backoffice.
Primitiva Node-especifica#
const newModuleHandlers = new Map(): un Map global donde cada consumer apunta al nuevo handler. Registrar un nuevo consumer al strangler es registerNewHandler('mobile', handler) — no requiere reload del proceso, no requiere clases ni jerarquia. La ACL es un closure: filtra el contrato esperado en el lugar donde se llama.
Arranque#
docker compose -f compose.yml up -d --buildPuerto local: 827 (modo aislado).
Como consumir (dos opciones)#
Hub Node (recomendado): compose.nodejs.yml en raiz → este caso vive en http://localhost:8300/07/....
Modo aislado: este compose levanta solo el caso 07 en :827.
Endpoints (via hub :8300/07)#
curl http://localhost:8300/07/
curl http://localhost:8300/07/health
curl "http://localhost:8300/07/change-legacy?scenario=shared_schema&consumer=web"
curl "http://localhost:8300/07/change-strangler?scenario=shared_schema&consumer=web"
curl "http://localhost:8300/07/flows?limit=10"
curl http://localhost:8300/07/diagnostics/summary
curl http://localhost:8300/07/metrics
curl http://localhost:8300/07/metrics-prometheus
curl http://localhost:8300/07/reset-labEndpoints (modo aislado :827)#
Reemplaza 8300/07 por 827 en los curls de arriba.
Que observar#
blast_radius_scoreyrisk_scoreson sustancialmente menores en strangler que en legacy;consumers_fully_migratedsube tras varias llamadas a strangler;shared_schemayparallel_conflictrompen legacy con TypeError / Error nativo, mientras strangler completa con 200.