[ DUVIDA ] Como construir uma aplicação escalavel do jeito certo
Sobre mim
Eu programo a menos de 1 anos e só consegui minha primeira oportunidade a cerca de alguns meses, tenho experiencia principalmente com React e NestJs que são as tecnologias que mais estou usando nesse trabalho.
O projeto
Recentemente acabei fechando um freela por fora com um cliente, meu primeiro projeto "grande", de início se trata de apenas um site com um sistema de login e registro e alguns vídeos, algo realmente bem simples, porém o cliente já deixou claro que tem planos de expandir isso, tendo a necessidade de até mesmo um dashboard para que ele possa controlar e administrar os dados do site.
Por mais que eu seja iniciante quero entregar um serviço o mais bem feito possível, por isso estava pensando em quais tecnologias utilizar e oque eu deveria saber antes de começar esse projeto, o cliente prevê que esse site deve receber cerca de 4 milhões de cadastros em 4 meses, meu plano atualmente é utilizar NextJs (não decidi entre o 12 e o 13 ainda) no front e Nestjs no back, pois pela minha experiência até agora eles parecem realmente robustos para um caso como esse.
Tive dificuldade em achar esse tipo de conteúdo na internet, pois eu não sei, por exemplo, como saber se meu servidor vai aguentar um número alto de requisições, e se não aguentar como eu devo prosseguir, como testar se o servidor vai aguentar e muitas outras dúvidas eu ainda tenho.
Obs: Como eu disse ainda sou bem iniciante na área e talvez eu esteja pensando em criar uma bazuca para matar uma mosca, se alguém achar que eu estou pensando d+ para algo que nem é tão grande assim pode falar.
Edit: Sou eu quem vai fazer o upload dos videos, o cliente só vai me passar quais que ele quer que eu adicione e eu irei adicionar, pensei em talvez futuramente permitir que no dashboard de ADM dependendo do nivel de acesso a pessoa possa editar ou adicionar videos mas não conversei com o cara sobre ainda.
4 milhões de cadastros em 4 meses
Irreal! Muito irreal Se tiver 500 mil é muito kkk Parando a brincadeira kkk
Para te ajudar temos que ter mais dados do que você esta fazendo.
No mais, ja deram dicas de vídeos que podem te ajudar a ter uma ideia geral do que fazer!
O principal problema que você vai ter é banco de dados! A aplicação aguenta bem. Mas o banco...
Uma ideia: Nginx depois a aplicação sem estado para poder rodar em N processadores(usa PM2). Isso já suporta muita coisa! Não é isso que vai dar gargalo inicialmente. A não ser que o negocio tenha muitas e muitas validações e processamento pesado! Ai da pra usar processos filhos ou work threads vai ajudar, ou fila para processar depois!
Um crud bem feito não vai dar problemas!
Usando aws vc vai aumentando o server até poder criar microserviços caso precise! Deu gargalo, fila de espera - se puder fazer!
O gargalo vai estar no banco(quase sempre esta nele). Sugiro filas! Não prcisa ser nada grande como um Kafka. Uma fila feita com Postrgress roda bem até uma certa altura!
Seu caso é vídeo neh, então o vídeo vai ser armazenado por vocês? Ou pode ser no S3(melhor escolha) faz upload sem passar pela sua aplicação :)
Os usuários precisam upar os vídeos? Passa direto pra S3 e mais tarde otimiza com jobs(filas)
É só ver os vídeos que estão com vocês? Se tiver no seu server os vídeos Usa HTML streaming - simples de fazer no node Video Streaming with Node.js / HLS
Eu recomendo o serviço da CloudFlare para vídeo! CloudFlare vídeo streaming Para guardar coisas, tbm sugiro o R2 da cloudflare Ou outro mais barato!
Abraços!
Muito interessante a pergunta! Vamos por parte.
Metodologia 12 fatores (The Twelve-Factor App)
Algo paupável que você pode (deve) ter em mente ao desenvolver uma aplicação escalável do jeito certo é seguir a metodologia dos doze-fatores (https://12factor.net/pt_br/).
De modo bem simplista, essa metodologia, se seguida corretamente, permite que sua aplicação seja escalável, além de garantir que boas práticas de desenvolvimento foram seguidas.
Ainda que inicialmente você não possa/consiga seguir todas elas, você terá um norte para saber o que deve ser feito num futuro próximo.
Práticas Recomendadas
Outras práticas do dia-a-dia que recomendo são:
- 1 - Ter múltiplas instâncias da aplicação e um load balancer na frente, como por exemplo um NGINX.
- Se não sabe o que é load balancer veja (https://youtube.com/shorts/OcI-JLXZV3g?feature=share)
- 2 - Conteinerizar sua aplicação, criando por exemplo um dockerfile para construir a imagem da sua aplicação
- Veja o que é Docker e Dockerfile (https://youtube.com/shorts/ZsfyX2Um9Aw?feature=share)
- 3 - Usar Kubernetes para gerenciar os containers
- O que é Kubernetes? (https://youtu.be/-IPmRhVzXzI)
- 4 - Utilização de CDNs, como Cloudflare
Porque usar cada uma dessas práticas?
-
O Load Balancer vai distribuir a carga entre as instâncias da sua aplicação. Desse modo, você vai conseguir por exemplo rodar 3 instâncias da aplicação em 3 máquinas diferentes, evitando que uma única instância fique sobrecarregada. Isso é o que chamamos de escalabidade horizontal. Se surgir a necessidade de aumentar o número de instâncias, basta subir novas instâncias e configurar o load balancer para redistribuir a carga também para elas.
-
Quando você conteineriza uma aplicação, permite que ela rode em múltiplos ambientes, com por exemplo diferentes arquiteturas. Isso permite por exemplo você usar máquinas de mais baixo custo, como por exemplo as que usam a plataforma ARM na nuvem da Oracle. Além disso, um container já tem todas as dependências necessárias para a execução da aplicação, o que torna a implantação da aplicação muito mais fácil.
-
O uso do Kubernetes como orquestrador de containers vai trazer diversas vantagens para você, como por exemplo:
- Utilização de healthchecks para avaliar a saúde dos seus containers
- Possibilidade de atualização com zero downtime, ou seja, o cliente nem vai perceber que você está atualizando a aplicação
- Facilidade para escalar horizontalmente sua aplicação
- Integração com plataformas de nuvem como AWS
- E muitas outras
-
Uma CDN (Content delivery network) vai permitir que recursos como imagens, css e outros tipos de recurso que podem ser cacheados sejam distribuídos pela rede, sem que a sua aplicação tenha que consumir recursos para fazer esse serviço
Eu não sei nada disso, e não sei por onde começar
Minha sugestão é começar com passos pequenos. O primeiro deles é montar um ambiente de testes usando Docker Compose. Com o Docker Compose você consegue já aprender e testar diversas questões relacionadas ao item 1 e 2. Num caso simples, você teria 3 serviços: O Load Balancer (NGINX ou qualquer outro semelhante), as instâncias da sua aplicação do frontend (eventualmente poderia o próprio load balancer executá-la), as instâncias da aplicação do backend e o banco de dados. Imagens para Load Balancers e bancos tem aos montes no https://hub.docker.com/.
A sintaxe do Docker compose é bem simples, e vocÊ pode aprender aqui por exemplo: https://docs.docker.com/compose/gettingstarted/
Aí vai ficar faltando você criar o(s) Dockerfile(s) da sua aplicação. Como você está pensando em usar NextJS, um site bem didático é esse daqui:
https://www.koyeb.com/tutorials/how-to-dockerize-and-deploy-a-next-js-application-on-koyeb
Uma vez definido esse ambiente local, você já poderá testar a utilização de variáveis de ambiente. Isso é interessante por que vai permitir que você mude o comportamento da sua aplicação, dependendo do ambiente em que ela estiver.
Dominado esse passo, você vai poder partir para o Kubernetes. Para aprender, é só seguir a série https://youtu.be/gEyOJAVkwZ4
Realmente preciso de tudo isso?
Aí depende de cada caso, mas é muito provável que com uma única instância você consiga atender toda a demanda por três motivos:
- Normalmente os clientes tendem a sobrestimar a carga que receberão
- Esse número de cadastros (4 milhões) vai ser diluído ao longo dos dias. O que eu quero dizer é que num determinado momento, é muito provável que você não tenha esse número de usuários acessando simultaneamente
- Pela descrição inicial da aplicação, não parece ser uma aplicação que vai demandar grande poder de processamento
Espero que possa ter coloborado ao menos um pouco com suas dúvidas! Mas se quiser, fique à vontade para perguntar mais coisas!
O Fabio Akita fez um ótimo vídeo sobre técnicas de otimização recentemente, você pode ver ele aqui. Também dê uma olhada nos vídeos que ele vai recomendando, principalmente o do ingresso.com.
É como o Renan disse, se isso envolver upload de vídeo na própria plataforma aí complica bastante.
Cara voce tem um grande problema kkk Mas nao se desespere, da para fazer sim, sendo mais especifico o que os usuarios irão fazer nesse site?
Se for somente o cadastro para o usuario ver o video blz, agora se for para o usuario fazer o upload do mesmo ai o negocio muda completamente.
Um ponto a se freezar primeiro é o que realmente voce terar tudo isso de acesso em apenas 4 meses, e meio que estranho voce conseguir 1 milhao por mes isso da quase 30k de acesso e cadastro por dia, o negocio e trabalha tambem com distribuidores de "cargas" os vamosos divisoes de servidor tipo um NGINX que distribui a carga e se congestionar coloca a pessoa em uma "Fila e tal".