Por qué un solo servidor no alcanza y cómo un load balancer lo resuelve.
→ avanzar · S notas del orador · F pantalla completa · O vista general
Deslizá hacia abajo para recorrerla. Las simulaciones se activan al llegar a cada una.
github.com/gastonprieto/presentacion-load-balancerAsí arrancan casi todos los sistemas: toda la app corre en una sola máquina.
2/4 = requests en proceso / capacidad (workers).
La barra es la carga. Los cuadraditos naranjas a la izquierda son la cola.
Si ese servidor cae (falla de hardware, kernel panic, OOM, un rm -rf…), cae todo el sistema.
4 workers × ~0,8 s por request → capacidad máxima ≈ 5 req/s.
503 Service UnavailableScale up: «comprar una máquina más grande».
Para actualizar hay que detener el proceso. Mientras arranca la versión nueva, nadie atiende.
En vez de una máquina más grande, muchas máquinas iguales. El LB es el único punto de entrada y reparte el tráfico.
Por turnos: 1→S1, 2→S2, 3→S3, 4→S1…
i = (i + 1) % N
return servers[i]
El LB elige el servidor con menos conexiones activas.
El promedio y la mediana esconden a los usuarios con mala suerte: unos pocos requests lentos estiran la cola.
servidor = hash(IP) mod N: el mismo cliente siempre cae en el mismo servidor (mirá los colores).
Servidores de distinto tamaño: S1 tiene peso 3, así que recibe 3 de cada 5 requests.
pesos 3,1,1 → S1 S1 S2 S1 S3 …
El LB consulta periódicamente GET /health a cada servidor. Si falla N veces seguidas, lo saca de la rotación.
Cada servidor guarda la sesión en su memoria. El LB reparte por turnos…
401Sticky sessions: el LB recuerda a qué servidor fue cada cliente (cookie) y lo manda siempre ahí.
Servidores stateless: la sesión vive en un store compartido (Redis, DB, o un JWT en el cliente).
Variantes: blue/green (dos entornos completos y se cambia el LB) y canary (un % del tráfico primero).
Escalamos la app… pero todos los servidores le pegan a la misma base de datos. El cuello de botella se mudó.
Todas las consultas van a una DB: 4 conexiones × ~0,5 s ≈ 8 req/s. Subí el tráfico y agregá servidores: la cola se forma en la DB.
Un caché (Redis) responde el 80% de las lecturas en ~60 ms; solo los misses llegan a la DB. ⚠️ Invalidación y datos viejos.
SPOF, tope de capacidad, techo vertical y downtime en cada deploy.
N servidores idénticos detrás de un load balancer. El cliente solo ve el LB.
RR simple · Least Conn cargas variables · Hash afinidad · Weighted nodos distintos.
El LB detecta nodos rotos, los saca de rotación y los reincorpora.
La sesión en un store compartido, no en la memoria del servidor.
IP/puerto, rápido y genérico, vs. HTTP: routing por path, headers y cookies.
Activo-pasivo con VIP y heartbeats, o un LB gestionado.
Drenar, actualizar, verificar y seguir: deploys sin cortar el servicio.
Escalar la app no escala la DB: un caché adelante la alivia.
En el Architecture Playground armás un sistema con las piezas que vimos (clientes, servicios, load balancers, proxies, cachés, colas, brokers) y lo ponés bajo carga.
Arrancá por el preset Load Balancer y probá otro algoritmo, un servidor lento o uno caído.
Abrir el playground →🐳 En el repo también hay un laboratorio con Docker para probar lo mismo con servicios de verdad.