Published: April 14, 2025
40
141
2.4k

COMO ESCALAR UM SISTEMA PARA 1 MILHÃO DE USUÁRIOS? Esses tempos eu estudei sobre system design e quero compartilhar com vocês o que eu aprendi sobre isso, afinal a melhor forma de aprender é ensinando, então segue o fio que vou ensinar vocês como escalar um sistema! 🧵

Image in tweet by console.log("Stephanto")

Antes de tudo, gostaria de reforçar que caso queiram se aprofundar, o vídeo do @RealGalego sobre o assunto é muito bom. Dito isso, vamos lá!

O fluxo comum de um usuário ao acessar um site é: Acessar o o site pela URL, o DNS traduzir o endereço, a requisição chegar no servidor e devolver o conteúdo para o usuário

Image in tweet by console.log("Stephanto")

Se começarmos a ter usuários acessando nosso site e quisermos guardar seus registros e/ou ter um backend que queremos armazenar dados, temos que ter um database que vai salvar e resgatar esses dados

Image in tweet by console.log("Stephanto")

Porém, como temos apenas 1 servidor, a medida que o número de usuários aumenta, pode gerar delay e timeout para alguns usuários, para isso adicionamos o loadbalancer que vai cuidar de encaminhar os usuários para os diferente servidores para não sobrecarregar

Image in tweet by console.log("Stephanto")

Agora, como teremos mais de um banco de dados (por conta do aumento de servidores), precisamos garantir a consistência dos dados. Podemos utilizar o método de Master/Slave, que somente 1 database recebe as escritas, replica para os outros e eles apenas leem os registros

Image in tweet by console.log("Stephanto")

Vamos dar uma olhada em como ficou nosso sistema até agora então, está bom mas ainda podemos melhorar bastante a performance

Image in tweet by console.log("Stephanto")

Podemos adicionar um cache para dados frequentemente acessados. Assim, melhora a velocidade e poupa acessos ao banco de dados pela memória cache ser mais rápida

Image in tweet by console.log("Stephanto")

Podemos também adicionar um CDN. Um CDN é um servidor estrategicamente localizado em um lugar que seja mais perto do cliente, funciona semelhante a um cache

Image in tweet by console.log("Stephanto")

Com essas adições nosso sistema esta desta forma até agora:

Image in tweet by console.log("Stephanto")

Ok, mas como escalamos ainda mais? Podemos mover uma parte do sistema para stateless, por exemplo, tirar o estado do usuário do servidor e adicionar em um NoSQL. No exemplo abaixo é como seria o acesso do usuário sem stateless, sua sessão e foto de perfil ficam apenas em 1 server

Image in tweet by console.log("Stephanto")

Já com stateless, adicionamos um shared storage para adicionar a sessão e a foto de perfil do usuário, para manter uma boa experiência de usuário (se o loadbalancer jogar ele pra outro servidor, ele não ser deslogado ou coisa do tipo)

Image in tweet by console.log("Stephanto")

Com essa adição, nosso sistema está ficando cada vez mais bonito e escalável

Image in tweet by console.log("Stephanto")

Ta bom, mas e se seu sistema quer internacionalizar? Para isso, vamos ter outro datacenter em outro país, e com isso, adicionamos um outro loadbalancer mas com algoritmo de georoute nele

Image in tweet by console.log("Stephanto")

Uma boa prática (algumas vezes) é desacoplar alguma função frequente que ser servidor faz para aumentar o desempenho e diminuir o overload em um macro-serviço. Exemplo, podemos fazer um sistema separado para processamento de imagens no nosso servidor usando sistema de filas+

Com esse sistema de filas, caso algum servidor caia, não é perdido a requisição, além de, como dito anteriormente, diminuir o overload

Image in tweet by console.log("Stephanto")

Com isso, nosso sistema fica dessa forma

Image in tweet by console.log("Stephanto")

Por fim, o que podemos fazer é diminuir a sobrecarga do banco de dados. As bases de dados estão apenas com redundância até agora, com os mesmos tipos de dados em todos eles. Com isso, podemos usar um método chamado sharding

Sharding é, de forma simplifcada, usar um algoritmo para dividir a alocação de um registro em bases de dados diferentes. O exemplo abaixo vai elucidar melhor. Vou pegar o id do usuário e fazer módulo 4, o resultado vai fazer com que ele seja salvo em um DB especifico

Image in tweet by console.log("Stephanto")

Essa é uma visão de como ficaria cada um dos bancos de dados após o sharding

Image in tweet by console.log("Stephanto")

Agora juntando tudo isso que temos, voltamos para a imagem inicial da Thread. Vocês tem um sistema escalável para 1 milhão de usuários! Espero que tenham compreendido de forma simples o funcionamento disso. Novamente, aconselho aprofundar no assunto! Obrigado por ler até aqui!

Image in tweet by console.log("Stephanto")

Share this thread

Read on Twitter

View original thread

Navigate thread

1/22