Contextualizando a necessidade de escala horizontal
Neste vídeo, vamos falar sobre escala horizontal. No vídeo anterior, tratamos de escala vertical, que ocorre quando escalamos aumentando o tamanho da máquina que temos, por exemplo, de uma CPU para duas CPUs. Em algum momento, porém, chegamos ao limite dessa técnica: não existem máquinas maiores disponíveis ou o custo se torna muito alto.
O que precisamos fazer? A resposta é simples: adicionar mais máquinas. Em vez de um único servidor respondendo por todas as solicitações da aplicação, colocamos duas máquinas respondendo às solicitações das pessoas usuárias. Quando duas máquinas não forem suficientes, colocamos três; depois quatro, cinco e assim por diante. Percebemos, então, que não temos mais o mesmo limite. Antes, existia um limite físico relacionado ao tamanho da máquina. Agora, não há limite para a quantidade de máquinas que podemos adquirir para distribuir o trabalho de responder a todas as solicitações que chegam. Afinal, é muito mais fácil ir adicionando várias máquinas menores lado a lado do que manter uma máquina gigantesca e continuar tentando escalá-la. Não existe o limite físico anterior; podemos posicionar quantas quisermos lado a lado.
Explicando os desafios de projetar para múltiplas máquinas
Uma desvantagem, entre aspas, da escala horizontal é que precisamos alterar a maneira como projetamos o sistema para que isso funcione. Na escala vertical, isto é, tudo em uma única máquina, não precisamos pensar no fato de haver várias máquinas respondendo a solicitações diferentes de pessoas usuárias distintas. E talvez a mesma pessoa usuária, na primeira solicitação, caia no servidor 1 e, na segunda, caia no servidor 2. Ao pensarmos em escalar horizontalmente, todas essas situações podem ocorrer.
Primeiro, precisamos garantir que as solicitações, quando chegam, sejam divididas de forma aproximadamente equilibrada: com duas máquinas, algo como 50% para cada uma; com três máquinas, cerca de um terço para cada. Portanto, precisamos de um componente na frente para controlar para onde cada solicitação vai.
Adotando serviços sem estado e considerando vantagens e desvantagens
Depois disso, devemos lembrar que, se a solicitação da pessoa usuária chegar à máquina 1, a seguinte pode chegar à máquina 2. Assim, a máquina 1 não pode manter nenhuma informação que a máquina 2 não possua. Isso é o que chamamos de estado compartilhado, e costuma ser uma ideia mais complexa quando pensamos em escala horizontal.
Por isso, preferimos projetar serviços sem estado. Ou seja, se a solicitação chegar ao servidor 1 ou ao servidor 2, tanto faz: qualquer servidor pode responder a qualquer solicitação de qualquer pessoa usuária.
Quando precisamos manter estado, como procedemos? Precisamos recorrer a recursos como banco de dados, cache, etc. Ao programarmos um sistema distribuído, passamos a considerar diversos outros aspectos que, antes, não eram necessários quando tudo estava em uma única máquina.
Em arquitetura de software, sempre existem vantagens e desvantagens em cada técnica. Nada é perfeito; não existe bala de prata.
Detalhando o papel do load balancer e a tolerância a falhas
O componente Load Balancer (balanceador de carga), como mencionamos, tem a função de dividir o tráfego. Quando chega uma requisição, ele analisa todas as máquinas disponíveis e decide: por exemplo, se a máquina número 3 está mais livre, encaminha a requisição para a máquina número 3; na próxima, verifica novamente e, se a máquina número 4 estiver mais disponível, envia para a máquina número 4. O próprio nome indica: o Load Balancer recebe a requisição e determina para onde ela deve ir.
Existem várias técnicas para que o Load Balancer decida o destino de cada requisição, e ele precisa ser suficientemente inteligente para lidar com falhas. Imaginemos que temos 10 máquinas e uma delas cai. Agora ainda existem 10 máquinas previstas, mas apenas 9 estão funcionando. O Load Balancer precisa detectar a falha e deixar de enviar requisições para essa máquina até que volte a operar. Isso adiciona complexidade: o Load Balancer é um software que requer atenção. Normalmente, não o implementamos do zero; provedores de nuvem como Amazon Web Services (AWS), Microsoft Azure, Oracle Cloud Infrastructure (OCI), etc. oferecem esse componente. Porém, precisamos configurá-lo e garantir seu funcionamento.
Consolidando a escolha pela escala horizontal
Escala horizontal
A escala horizontal é, em essência, a escolha natural para software que precisa escalar. Em algum momento, ao atingirmos algumas centenas ou os primeiros milhares de pessoas usuárias, percebemos que uma única máquina não dá conta. A decisão pela escala horizontal torna-se bastante natural.
Na prática, todo serviço de porte moderado ou grande utiliza escala horizontal; é inviável escalar apenas de forma vertical. Costumamos começar com escala vertical quando temos algumas dezenas, talvez poucas centenas de pessoas usuárias; ao ultrapassar esse patamar, o próximo passo passa a ser a escala horizontal.
Neste vídeo, discutimos a ideia de escala horizontal. Qual é a ideia? Em vez de escalar aumentando a capacidade de uma única máquina, tornando-a mais potente, escalamos adicionando várias máquinas menores que, em conjunto, atendem a todas as requisições.