[ 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!

Vou dar uma olhada no S3 e nesse PM2 Eu tinha esquecido sobre o banco acredita? kkkkkkkkk Eu vi que existem alguns sistemas de cache que ajudam muito a aliviar a pressao na DB oque me deixou com duvida é se esse tipo de sistema ja é incluso em algum serviço de banco dados ou se eu que tenho q configurar isso em algum servidor por fora de algum jeito
O redis faz isso! O SqLite faz isso! E tem serviços que fazem isso tbm, a CloudFlare tem essas paradas! Mas se seu cliente disse que é tudo ele tem que pagar bem! Vai precisar de equipe de devops e esse projeto tende a demorar meses para sair do papel para suportar esses 4 milhões! PM2 é um gerenciador de processos para o runtime JavaScript Node.js. quando vc coloca ele pra rodar em N processadores é o mesmo que usar o Cluster do Node! Um mesmo PC com 5 processadores e cada um rodando o mesmo projeto Node completo. um S3 ou um R2 ou o serviço de streaming da Cloudflare nem precisa passar pela sua aplicação os vídeos nem pra upload nem pro usuário ver!
Ctz que precisa de uma equipe de Devops? tipo no futuro ele provavelmente vai se tornar maior porém por agora não passa de uma pagina de cadastro com uns videos e umas 2/3 telas
Ué, não é 4 milhões em 4 meses? Se não me engano isso da 1.55 requests por segundo! Mas pense não é apenas 1 request. O requeste d página o front segura de boa! Agora usar a aplicação(cadastro, colocar, tirar coisas(caso o user seja permitido)), usar o banco e baixar o vídeo. Se o vídeo tiver no seu servidor tranformar ele em streaming tem custos altos em processamento. Depende de como você vai fazer! Se for apenas um cadastro de email. E o vídeo vier de outras fontes(s3, r2 outro sistema de streaming) Um servidor pequeno deve aguentar de boa! Como eu disse antes, depende muito de como será a implentação do projeto! 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:

Porque usar cada uma dessas práticas?

  1. 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.

  2. 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.

  3. 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
  4. 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!

Nossa eu não sei nem como agradecer KKKKKKKKKKK eu estou realmente muito perdido nesse momento inicial nunca nem fiz um deploy de uma aplicação pra algum cliente na vida, geralmente quem faz essa parte é meu superior, muito obrigado mesmo vou dar uma olhada nos conteudos que você passou No momento a unica coisa q eu to pensando é no tamanho do servidor que eu vou ter que contratar, o cliente falou que oque eu falar que precisa pra hostear ele vai pagar só que eu n queria passar um valor e acabar sobrando muito, sei que é quase impossivel determinar isso com certeza mas por exemplo uma maquina com 4 nucleos ja é muita coisa pra uma aplicação como essa com essa quantidade de usuarios?
@Mikaellpc, desculpe a demora. Eu acho que é importante analisar a seguinte situação. Se você conseguir automatizar o esquema de implantação da sua aplicação, vai ser fácil, caso esteja superestimada a capacidade do servidor, de fazer a implantação numa máquina mais adequada. Se você conseguir monitorar o consumo de recursos da máquina ao longo por exemplo de uma semana (isso é muito fácil nas nuvens), vai conseguir identificar picos de acesso e de consumo de recursos. Com isso, vai saber a capacidade máxima utilizada e vai poder dimensionar melhor a máquina. Segundo você "o cliente falou que oque eu falar que precisa pra hostear ele vai pagar". Então aproveita, começa com uma capacidade maior (claro, não precisa pegar a máquina mais forte disponível por exemplo, rsrs), avalia durante uma semana, e aí redimensiona. Pode ter certeza que desse modo, você vai mostrar seu comprometimento profissional, de procurar sempre melhorar, e além disso, é MUITO MELHOR ele pagar um pouco a mais do que deveria, mas GARANTIR que todos os clientes dele serão atendidos adequadamente, do que o contrário, ou seja, "economizar alguns dólares", e no momento de pico travar todo o sistema. É seu primeiro projeto grande, não tente ser perfeito desde o início. Comece com excesso de zelo, e vai afiando o machado conforme for ganhando mais entendimento da aplicação.

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.

Vou dar uma olhada! Obrigado pela sugestão

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".

Eu quem vou fzr os uploads o cliente vai só me passar quais são os videos que ele quer que eu adicione
Ah entao no caso as pessoas que visitarao o site so para ver os videos certo?
No geral sim, são videos de algumas pessoas em especifico que a empresa vai fazer parceria
Entao vai ser mais facil pois o video da para voce subir no Youtube ou qualquer outro site e utilizar a API do mesmo para buscar o video (ai ja busca titulo e tudo mais) No caso como so vai ter login vai ser ate simples de fazer, somente login e senha e video para assistir. Ta tranquilo entao, so vai ter que tomar cuidado com a quantidade de Usuarios para nao da TimeOut.