Quando uma máquina não basta
Chega um ponto em que seu serviço recebe mais tráfego do que uma única instância consegue atender. Há duas formas de crescer.
Vertical vs. horizontal
- Escalonamento vertical (scale up): uma máquina maior (mais CPU, mais RAM). Simples, sem mudanças no código, mas tem um teto (não existe máquina infinita) e é um único ponto de falha: se cai, cai tudo.
- Escalonamento horizontal (scale out): mais máquinas iguais em paralelo, e você reparte o tráfego entre elas. Não tem teto prático e tolera falhas (se uma instância cai, as demais seguem). Em troca, exige projetar a aplicação para isso.
Na prática moderna se prefere o horizontal, e é a base da nuvem.
O balanceador de carga
Um balanceador de carga (load balancer) é a peça que fica na frente das suas instâncias e reparte as requisições entre elas (por rodízio, por menos conexões, etc.). O cliente fala com um único endereço; o balanceador decide qual instância responde. Além disso consulta os health checks e para de enviar tráfego às instâncias que não respondem.
A chave do horizontal: ser stateless
Para poder repartir livremente as requisições entre instâncias intercambiáveis, cada instância deve ser sem estado (stateless): não guarda na sua memória local nada que a próxima requisição precise. Por quê? Porque o balanceador pode mandar a requisição 1 de um usuário para a instância A e a requisição 2 para a B. Se a sessão vive na memória de A, a B não a conhece e o usuário "perde" sua sessão.
A solução: tirar o estado compartilhado para fora, para um armazenamento que todas compartilham — o banco de dados, Redis para sessões/cache, um serviço de arquivos. As instâncias ficam descartáveis: você pode criar, destruir ou substituir qualquer uma sem perder nada. Isso é justamente o que habilita o que vem a seguir.
Autoescalonamento e testes de carga
- Autoescalonamento: o sistema adiciona ou remove instâncias automaticamente conforme a demanda (p. ex. "se a CPU média superar 70 % durante 5 min, adicione uma"). Você paga pelo que usa e absorve os picos sem intervenção manual. Só é possível se os serviços forem stateless.
- Testes de carga (load testing): antes da produção, você simula tráfego crescente para encontrar o ponto de ruptura e validar que o autoescalonamento reage. Melhor descobrir o limite num ensaio do que no lançamento real.
Resumo mental: stateless te deixa escalar horizontalmente, o balanceador reparte a carga e o autoescalonamento ajusta o número de instâncias à demanda. E você mede tudo com as métricas do primeiro pilar.
Exemplos
Balanceamento round-robin: repartir por rodízio entre instâncias
function criarBalanceador(instancias) {
let i = 0;
return function seguinte() {
const escolhida = instancias[i % instancias.length];
i++;
return escolhida;
};
}
const lb = criarBalanceador(["A", "B", "C"]);
console.log([lb(), lb(), lb(), lb()].join(" ")); // A B C A