Nascido para desenvolver 🧐 Sobre o meu trabalho

Devopers.

🏗️ O que é escalabilidade horizontal?

Cover Image for 🏗️ O que é escalabilidade horizontal?
Iago Silva Ambrosio
Iago Silva Ambrosio

Alguém sente saudade da stack LAMP?, um acronimo para Linux, Apache, Mysql e PHP, temos uma certa tendência a lembrar das coisas com nostalgia, era simples, meia duzia de comandos, e pronto, uma stack configurada, pronta para servir uma aplicação para diversos usuários. Para uma máquina de testes não tem problema,simplicidade é melhor do que scripts complexos com regras de negócio capazes de quebrar toda estrutura se uma variável não estiver declarada.

https://d11jah725t2vm2.cloudfront.net/geek/lamp-stack-1650018911880.webp

Junto com a stack de desenvolvimento, bem provável que um ecommerce da vida seria instalado direto em uma VPS, de baixo custo, e só seria escalado se aumentasse a demanda, e foi aí que surgiu a necessidade de uma revisão desse modedo de negócio.

Por que não simplesmente pagar uma VPS?

Rollback! a principal dificuldade de colocar um serviço em uma VPS é que quando se ESCALA ums servidor verticalmente é muito custoso derruba-lo em seguida, idealmente você só precisa de mais capacidade computacional em algumas ocasiões específicas (como black friday). Sem capacidade de rollback e pagando por uma máquina gigantesca, o que fazer neste caso? é ai que entra a mágica da letra L do acrônimo.

FORK!!! IEA

Lendo um artigo do Italo sobre escalabilidade me causou algumas reflexões sobre a forma como separamos nossa aplicação para escalar, se você tem razoável experiência em linux, sabe o que são forks, quando chamamos um processo no terminal (geralmente executando bash) o processo pai (bash) puxa um processo filho (tail) idêntico, que utiliza menos memória, e a partir desse fork cada processo segue sua vida independente.

    |         |-gnome-terminal--+-bash---su---bash
    |         |                 |-bash---tail
    |         |                 |-bash---pstree

Perceba, o processo do gnome-terminal possui três processos executando processos separados, mas isso são apenas processos de linux, mas em contexto de aplicação? como podemos visualizar? Primeiro, vamos trocar essa estrutura, deixando-a assim:

    |         |-usuário--+-nodejs---GET---/
    |         |          |-nodejs---POST---/carrinho
    |         |          |-nodejs---DELETE---/id/21410314

E está aqui o segredo para uma escala de uma aplicação, cada processo do nodejs pode executar uma requisição de usuário separadamente, você não precisa concentrar sua aplicação apenas em um servidor.

OK, e como forkamos uma aplicação?

Aqui é um spoiler, a melhor forma de escalar uma aplicação está descrita no site 12 factor apps, tenho um repositório onde estou demonstrando como colocar uma aplicação nestes fatores, e a aplicação é justamente a que mais se aproveitou da forma LAMP de fazer as coisas, tudo entuchado em um servidor em uma VPS. Mais para frente, farei um artigo descrevendo cada fator também, mas por hora, basta dizer que sua aplicação precisa se parecer um processo de linux (isso mesmo), nada compartilhado localmente, se é forkavel, cada processo segue independente após o fork com memória e comportamento próprio, de forma que você possa chamar a mesma aplicação mais de uma vez e o comportamento permanece o mesmo.

Não que a LAMP esteja obsoleta, mas a forma como se faz profissionalmente mudou bastante, como sugestão, é sempre bom sempre aprender como escrever uma boa dockerfile e orquestrar com docker-compose, ter tudo declarado em um repositório git e se beneficiar das variáveis de ambiente, estas são apenas algumas dicas de como tornar a LAMP em algo mais escalável.