DevPath · Aprenda a programar ESPTEN

Observabilidade e desempenho

Escalonamento: horizontal, balanceadores e stateless

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

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

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
Coloque isto em prática

O DevPath é um curso prático: aqui você lê a teoria; no app você a coloca em prática com exercícios que rodam de verdade, offline.

Comece grátis no app →
← Desempenho: cache, lazy loading e o BDVer o módulo →