Arranque en frio y retraso del autoescalado
El autoescalador suma instancias y la tasa de error sube con cada una: el proceso esta vivo y el healthcheck en verde mucho antes de que la instancia pueda servir.
📈 Que cambia para el negocio
Elimina los 503 durante los escalados y habilita autoescalado agresivo con confianza, que es la forma de que el autoescalado ahorre dinero en vez de mover el problema.
💼 Que demuestra tecnicamente
Es el unico caso que mide una propiedad del runtime en vez de simularla — la curva de calentamiento de cada uno, con el mismo codigo — y muestra que el indicador honesto no es cuanto tarda un servicio en arrancar sino cuanto tiempo afirma estar disponible sin estarlo.
✅ Evidencia que deja
- Contrasta /boot-cold y /boot-warmed con availability_pct medida DURANTE el escalado.
- Mide warmup_speedup_x con el mismo lazo entero en los 7 runtimes: Java 51,9x contra Rust 1,00x.
- Separa /health de /ready y expone health_vs_ready_gap_ms, la ventana exacta de la mentira.
👀 Que mirar al ejecutarlo
- Si rejected_cold_start es mayor que cero en la variante fria y exactamente cero en la corregida.
- Si health_vs_ready_gap_ms coincide con la ventana en que el proceso decia estar vivo sin poder servir.
- Si warmup_speedup_x separa a los runtimes con JIT de los compilados AOT con el mismo codigo.
Como esta resuelto en cada stack
Unico caso del lab que MIDE una propiedad del runtime en vez de simularla: el mismo lazo entero puro corre en los 7 stacks y warmup_speedup_x sale de comparar p99 de las primeras 100 peticiones contra p99 despues de 1000. Java 51,9x por compilacion en capas interp/C1/C2, .NET 2,3x por Tier 0/Tier 1 con OSR, Node 1,1x porque V8 llega a TurboFan enseguida, Python 1,8x que es contencion y no JIT, PHP 1,1x con el JIT apagado de fabrica, Go 1,0x y Rust 1,00x por compilar AOT. Mas la separacion liveness/readiness y el pool tibio con sync.Once, Lazy<T> y OnceLock
| Stack | Health check local | Compose | Detalle |
|---|---|---|---|
| 🐘 PHP 8.3 | http://localhost:8100/18/health | compose.root.yml | README del stack |
| 🐍 Python 3.12 | http://localhost:8200/18/health | compose.python.yml | README del stack |
| 🟢 Node.js 22 | http://localhost:8300/18/health | compose.nodejs.yml | README del stack |
| ☕ Java 21 | http://localhost:8400/18/health | compose.java.yml | README del stack |
| 🔵 .NET 8 | http://localhost:8500/18/health | compose.dotnet.yml | README del stack |
| 🐹 Go 1.23 | http://localhost:8600/18/health | compose.go.yml | README del stack |
| 🦀 Rust 1.83 | http://localhost:8700/18/health | compose.rust.yml | README del stack |
El expediente completo
El caso no empieza en el codigo: empieza en el sintoma y termina en el postmortem.