Cuando una máquina no basta
Llega un punto en que tu servicio recibe más tráfico del que una instancia puede atender. Hay dos formas de crecer.
Vertical vs. horizontal
- Escalado vertical (scale up): una máquina más grande (más CPU, más RAM). Simple, sin cambios en el código, pero tiene un techo (no existe una máquina infinita) y es un único punto de fallo: si cae, cae todo.
- Escalado horizontal (scale out): más máquinas iguales en paralelo, y repartes el tráfico entre ellas. No tiene techo práctico y tolera fallos (si cae una instancia, las demás siguen). A cambio, exige diseñar la aplicación para ello.
En la práctica moderna se prefiere el horizontal, y es la base de la nube.
El balanceador de carga
Un balanceador de carga (load balancer) es la pieza que está delante de tus instancias y reparte las peticiones entre ellas (por turnos, por menos conexiones, etc.). El cliente habla con una sola dirección; el balanceador decide qué instancia responde. Además consulta los health checks y deja de enviar tráfico a las instancias que no responden.
La clave del horizontal: ser stateless
Para poder repartir libremente las peticiones entre instancias intercambiables, cada instancia debe ser sin estado (stateless): no guarda en su memoria local nada que la siguiente petición necesite. ¿Por qué? Porque el balanceador puede mandar la petición 1 de un usuario a la instancia A y la petición 2 a la B. Si la sesión vive en la memoria de A, la B no la conoce y el usuario "pierde" su sesión.
La solución: sacar el estado compartido fuera, a un almacén que todas comparten — la base de datos, Redis para sesiones/caché, un servicio de ficheros. Las instancias quedan desechables: puedes crear, destruir o reemplazar cualquiera sin perder nada. Eso es justo lo que habilita lo siguiente.
Autoescalado y pruebas de carga
- Autoescalado: el sistema añade o quita instancias automáticamente según la demanda (p. ej. "si la CPU media supera el 70 % durante 5 min, añade una"). Pagas por lo que usas y absorbes los picos sin intervención manual. Solo es posible si los servicios son stateless.
- Pruebas de carga (load testing): antes de producción, simulas tráfico creciente para encontrar el punto de ruptura y validar que el autoescalado reacciona. Mejor descubrir el límite en un ensayo que en el lanzamiento real.
Resumen mental: stateless te deja escalar horizontalmente, el balanceador reparte la carga y el autoescalado ajusta el número de instancias a la demanda. Y todo lo mides con las métricas del primer pilar.
Ejemplos
Balanceo round-robin: repartir por turnos entre instancias
function crearBalanceador(instancias) {
let i = 0;
return function siguiente() {
const elegida = instancias[i % instancias.length];
i++;
return elegida;
};
}
const lb = crearBalanceador(["A", "B", "C"]);
console.log([lb(), lb(), lb(), lb()].join(" ")); // A B C A