Não vou opinar, mas vou dividir minha experiência...
A uns anos atrás estava passando dificuldades financeiras sérias, onde faltava até mesmo para comer, na época surgiu um job, simples, fácil, rápido e que poderia cobrar um bom valor, cobrei 1k e fiz o job em uma hora, diante disso a consciência pesou em relação valor cobrado VS. tempo de serviço, por fim que incrementei o sistema e o job totalizou 3 dias de serviço.
Após concluír eu parei para analisar a necessidade do cliente e vi que era uma boa brecha no mercado e resolvi investir na solução.
Então no desespero do momento (pela falta de dinheiro) eu corri o mais rápido possível para lançar um "SaaS", a qualidade de código e boas práticas eu ignorei completamente.
Fiz tudo rápido, nas coxas e de qualquer forma, mas algo que funcionasse e pudesse confiar até certo ponto!
Minha aplicação tem um cenário peculiar, ela fornece algumas funcionalidades a outros sistemas, os quais são de terceiros e mal desenvolvidos, esses sistemas executam rotinas diariamente e todos juntos, ou seja, clientes que usam sistema X começam a fazer requisições para o meu sistema tudo junto, no mesmo minuto e na mesma intensidade, em média cada cliente faz umas 1500 requisições ao dia, então pense tem sistema que faz umas 15 requisições por segundo para a minha aplicação, coloque 10 clientes, isso da 150 / req por segundo, embora eu tenho mais de 60 clientes hoje.
Minha infra começou de forma hibrida, nas primeiras semanas uma parte ficou em hospedagem compartilhada por medo de problemas que um servidor gerenciado por mim poderia trazer, mas em poucas semanas (menos de um mês) notei que teria problemas deixando na hospedagem compartilhada, criei coragem e coloquei em uma cloud (VPS), afinal de contas eu configurava servidores web a muitos anos e nunca tive problemas.
A outra parte da aplicação eu deixei localmente (PC pessoal), na cloud ficou partes que não seriam bom ficar offline (críticas), as quais os clientes acessam constantemente etc, localmente ficou uma parte que consumia muita memória RAM, algo que se fosse para colocar na cloud inviabilizaria o projeto e na hospedagem compartilhada nem daria.
Na cloud instalei tudo do zero, sem docker, e localmente em docker + swarm + traefik.
Bom, se passou um ano, eu "validei" o business e sai da crise financeira que estava, então tomei a postura de dar sequência no desenvolvimento pensando 100% em escalabilidade + qualidade de software, até então eu só ia melhorando o sistema e deixando ele mais confiável.
Mediante a isso comecei a desenvolver tudo como microsserviços etc.
Hoje +2 anos depois do lançamento...
Infra continua híbrida, nuvem está da mesma forma que começou, só que sofreu melhorias em performance (o sistema, hardware é o mesmo), basicamente otimizei algumas queries e removi outras.
Localmente mudou muita coisa!
Inicialmente era em PC pessoal, hoje roda em um cluster de Raspberry PI 4 8GB, tenho 11 nós, minha aplicação consumia 1 GB de RAM por cliente e para mim isso era um grande problema, mediante isso trabalhei incansavelmente em refazer toda essa parte, trocar certas tecnologias (que usavam uma aplicação Java de um terceiro), e do consumo de 1024 MB caiu para ~8 MB por cliente (Cada cliente tem um container limitado a 70 MB de RAM).
Isso fez com que minha aplicação que consumia 64GB de RAM para rodar ~50 clientes, rodasse em um Raspberry de 8GB e ainda sobrasse muito hardware.
Meu erros iniciais em questões de desenvolvimento + infra:
- Trabalhar com sessão do PHP local e não em banco ou de forma descentralizada;
- Não otimizar bem as queries, ainda mais que na nuvem a parte mais crítica é em MySQL (dentro do VPS gerenciado por mim);
- Ter medo de assumir certas responsabilidades (gerenciar servidor web por exemplo);
- Ter medo de utilizar certas tecnologias que deveriam ter entrado já no começo do projeto (Deveria ter usado RabbitMQ para comunicação da nuvem com ambiente local, porém por ficar com medo do desconhecido (RabbitMQ) eu desenvolvi minha própria solução, funciona até hoje, incomoda bem pouco, mas já está com os dias contados, vou migrar para o RabbitMQ);
- Não ter automatizado funções do dia a dia em relação ao negócio, como cobranças das mensalidades.
Erro 1 e 2 forma os principais problemas, NUNCA MAIS desenvolvo algo usando sessão local e tabelas sem índices bem planejados (no meu caso faltava índices).
Claro tiveram outros erros de projeto, mas nada significativo, esses que listei foram o que mais afetaram o business, criando dor de cabeça com clientes, noites mal dormidas etc.
Vou tentar listar todas tecnologias e outros que uso hoje:
- PHP;
- Symfony;
- Vue Bootstrap;
- SCSS;
- TypeScript;
- GoLang (amo muito PHP, uso ele há mais de 10 anos, foi muito importante para mim, mas GoLang mudou tudo!);
- MySQL (Não usem ele, usem PostgreSQL);
- PostgreSQL;
- RabbitMQ;
- Docker;
- Docker Swarm (dentro de poucos meses vou migrar para Kubernets);
- Cloud (VPS);
- Cluster de raspberry;
- Cloudflare (Uso ela em tudo que faço! Nesse sistema em questão uso DNS, CDN, WAF etc);
- Roteador e switch profissionais (hardware);
- Redundância energética ~6 horas de duração (isso localmente obviamente);
- Servidor de arquivos local com RAID 1 (espelhamento) de 3 TB (é um Raspberry também);
- Oracle Cloud.
Hoje a minha aplicação aguenta até 300 requisições por segundo (acho que vai até mais, porém só testei até isso pois é suficiente e sobra), lembrando que é o mesmo sistema feito as pressas, sem planejamento, sem nada! E aguenta +300 requisições por segundos.
A parte mais crítica ainda é um monolítico, pretendo desmembrar apenas a rota que recebe o tsunami de requisições, para que ela escale automaticamente e a parte de relatórios, talvez coloque um Elasticsearch gerenciado por mim ou então crie rotinas para deixar os dados mais estáticos e não ter que rodar tantas queries para listar uma tabela por exemplo...
Tudo é gerenciado e desenvolvido por mim, não tenho nenhum serviço terceirizado além do VPS na Oracle Cloud. É só pensar bem, planejar bem, fazer os microsserviços com responsabilidade que não da dor de cabeça, hoje ta muito na moda nuvem, é top demais, mas tem seu custo, eu tomei tudo para mim, quebrando o padrão do mercado que ta indo tudo para terceirizados, até então deu certo! Torço e trabalho para que se mantenha assim.
Enfim... Mais de dois anos já se passaram, venho ganhando clientes, no período de um ano sai de passando fome para classe média alta (embora ainda me sinta pobre). Não me arrependo de nada além dos erros que listei, nuvem hibrida vem sendo muito boa, não usar cloud me da uma ótima economia $$$ etc.
Não sou contra cloud, cloud é vida sim, mas nesse caso foi dispensável...
Vou lançar outro sistema dentro de alguns meses (um sistema free), vou fazer o máximo possível em monolítico, maasss, vou pensar e analisar bem, partes críticas, com alta carga eu vou fazer em microsserviço desde o começo, agora será tudo em GoLang, PostgreSQL, RabbitMQ, Redis e 100% local (por não ter receita no novo sistema), dentro do cluster de Raspberry com Kubernets.
O Kubernets vou fazer com 3 master e o resto workers.
A parte mais crítica para mim em um sistema é o banco de dados ele que sempre foi um gargalo / limitador no meu sistema, hardware e o sistema em si qualquer coisa fraca performa muito bem.
Não falei de custos… Cloud R 50,00 / mês, sim cinquenta reais apenas, local R 375,00 / mês, pois quis pegar um empréstimo para investir em infra, parece caro R$ 375,00, mas lembre-se eu tenho a minha disposição 88GB de RAM e 44 cores de processamento, sem contar o antigo servidor / PC que tem 64 GB de RAM.
Mas internet e luz? Eu já tinha ambas coisas, então o custo já existia, luz não mudou nada, minha infra roda tudo em 12v, 5v e baixa amperagem, extremamente econômica, a internet porque eu quis coloquei IP fixo, + R 50,00, então meu custo total é de R 475,00, no qual é insignificante perto do que eu ganho com o sistema.
Espero que minha experiência de vida agrege algo para vocês!