Escalar um sistema para suportar milhões de usuários é um desafio significativo. A complexidade aumenta com o aumento da carga de dados e usuários, demandando uma arquitetura robusta. Neste artigo, exploraremos como escalar um sistema para lidar com 1 milhão de usuários, utilizando boas práticas e abordagens como balanceamento de carga, caches, e sharding.

Image description

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 description

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 description

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 description

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 description

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

Image description

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 description

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 description

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

Image description

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 description

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 description

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

Image description

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 description

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 description

Com isso, nosso sistema fica dessa forma:

Image description

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 description

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

Image description

Agora juntando tudo isso que temos, voltamos para a imagem inicial do artigo. Vocês tem um sistema escalável para bem mais que 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 description