Executando verificação de segurança...
1

Infraestrutura inicial de um SaaS

Fala galera,
Estou finalizando o desenvolvimento de um SaaS onde já tenho potenciais clientes (não estou sozinho, estou junto com uma empresa relativamente grande e já possui uma carteira de clientes).

Gostaria de saber a opnião de vocês na questão da infra. Já tenho minha estrutura de kubernetes praticamente montada (embora o valor seja um pouco alto pra manter em relação a droplets comuns).

Vocês começariam com uma máquina comum mesmo (estando nela a aplicação, RabbitMQ e o banco de dados) ou já deixariam tudo rodando em kubernetes pra facilitar conforme for necessário escalar?

Pensei em utilizar o Google Cloud Run pra ficar mais simples ainda, porém como utilizo sockets e vai manter a conexão aberta me falaram que ia acabar ficando muito caro.

Então:

Já deixo rodando em kubernetes ou jogo pra uma estrutura mais simples até realmente ter a necessidade da escalabilidade (sabendo que não será tão distante)?

Caso siga por uma estrutura mais simples, deixo tudo em uma única "VM" ou separo (por exemplo, uma pra aplicação, outra pro rabbit e outra pro sql)?

Agradeço!

Carregando publicação patrocinada...
4

Antes de tudo parabéns! Muito bom que você esteja conseguindo construir seu negocio!

Eu pegaria um VPS desta lista > https://dev.to/urielsouza29/uma-lista-de-vps-baratos-51ne

Instalaria o coolify https://coolify.io/

Faria primeiro algo simples um simples monolito com as funcionalidades pretendidas
Mandaria no VPS e monitoraria tudo que pudesse!

Se precisar de mais vps, pegaria mais e pronto!

Você realmente acha que precisa de uma mensageria exterana no estagio inicial do projeto?
Da pra usar o PostgreSQL como mensageria de boa
https://www.youtube.com/watch?v=jTLP5DrIocA&t=69s

Não precisa ter um outro aplicativo para ter que dar manutenção

Não tentaria copiar grande empresa nenhuma.
kubernetes em inicio de projeto pra mim é um exagero sem fim que vai dar muita do de cabeça e custos que você não precisa nesse momento!

Não tente adivinhar o futuro. Dev é ruim demais nisso.
Você já acha que vai escalar e já coloca kubernetes pensando nisso!

Tenha clientes, veja a demanda depois pense nessas coisas.
Seu principal problema não sera infra, mas atendimento e vendas!

Abraços e boas vendas em!

2

Eu ia responder praticamente isso que você postou.

Começar em uma VPS simples, PG para mensageria também, e mesmo no futuro quando as coisas derem certo, dá para deixar parte da aplicação ainda nesse ambiente mais simples com os CRUDs da vida e colocar apenas os serviços mais pesados em ambientes mais poderosos.

1

Agradeço o seu posicionamento.

Bom, estamos falando de uma aplicação com chat em tempo real, então possuo clientes que facilmente alcançariam 5k+ mensagens por dia (sabendo que todo marketing será feito por uma empresa relativamente grande, agregando um valor imenso, teriamos uma projeção inicialmente de 15 clientes logo após lançamento + 3-7 clientes/mês).

Kubernetes realmente é uma dor de cabeça tremenda (mesmo sendo gerenciado).

Pensei em utilizar o postgre, mas acabei indo pro Rabbit msm (embora conheça mas nunca tenha utilizado postgre pra tal finalidade).

Tambem ja tive problemas com aplicações tendo 250/req por segundo em uma unica máquina e simplesmente matava o processo do sql (recursos nao passavam de 50%).

Acredito que o correto seja isso mesmo, uma máquina somente e fazer alguns testes de carga. Caso necessario adicionar mais um node com load balancer.

2

então possuo clientes que facilmente alcançariam 5k+ mensagens por dia

Isso é bem pouco! Qualquer serverzinho simples aguenta isso e mais!
(claro dependendo da stack usada tem que coisa que não da pra fazer)

Tambem ja tive problemas com aplicações tendo 250/req por segundo

Tem algo errado nisso! Isso não é o que deve acontecer! É pra qualquer aplicação
conseguir pelo menos umas 10 vezes isso com pouco recursos!

Mas claro depende do que você esta usando de stack.
Você não deixou as coias muito claras!
Não da pra advinhar as coisas!

Rabbit

Se você acredita que é uma boa, então deve ser! Só você conhece a dor que tem ai!

No mais, boa sorte. Que tudo de certo e ganhe dinheiro e pouca dor de cabeça com infra.
Abraços

1

Então, a questão das 250/req por segundo não fazia o menor sentido. Fiz inúmeros testes com jMetter e ficavam nessa média ai mesmo (basicamente uma aplicação simples com laravel/mysql). Foi otimizado tudo possível, configurado apache e sql pra não ter limitação mas nada adiantou.

Agradeço muito a sua ajuda, sem dúvidas me deu um norte!

2
1
0
1

Sim, foi otimizado todas querys "mal performáticas", inclusive removemos tudo que era possivel de query, deixando apenas conteúdo estático e mantinha a mesma média.

Possívelmente como o amigo citou acima, é um problema do Laravel.

1

Só mais uma ideia:

Hoje tenho tudo em docker, porém como não iria mais utilziar kubernetes precisaria de outro orquestrador se quizesse continuar com containers (podendo ser swarm ou até mesmo o compose).

Será que retiro de containers e crio uma vps instalando manualmente todos os serviços?
E aí caso fosse fazer sem docker utilizaria um pm2 e nginx pra redirecionar corretamente.

Oque voce faria nesse caso?

1

Você precisa fazer a conta.
O que vale mais a pena?

Pq as coisas podem ser complexas e vc perder tempo com isso no lugar de estar atentendo os clientes!

2

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:

  1. Trabalhar com sessão do PHP local e não em banco ou de forma descentralizada;
  2. Não otimizar bem as queries, ainda mais que na nuvem a parte mais crítica é em MySQL (dentro do VPS gerenciado por mim);
  3. Ter medo de assumir certas responsabilidades (gerenciar servidor web por exemplo);
  4. 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);
  5. 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:

  1. PHP;
  2. Symfony;
  3. Vue Bootstrap;
  4. SCSS;
  5. TypeScript;
  6. GoLang (amo muito PHP, uso ele há mais de 10 anos, foi muito importante para mim, mas GoLang mudou tudo!);
  7. MySQL (Não usem ele, usem PostgreSQL);
  8. PostgreSQL;
  9. RabbitMQ;
  10. Docker;
  11. Docker Swarm (dentro de poucos meses vou migrar para Kubernets);
  12. Cloud (VPS);
  13. Cluster de raspberry;
  14. Cloudflare (Uso ela em tudo que faço! Nesse sistema em questão uso DNS, CDN, WAF etc);
  15. Roteador e switch profissionais (hardware);
  16. Redundância energética ~6 horas de duração (isso localmente obviamente);
  17. Servidor de arquivos local com RAID 1 (espelhamento) de 3 TB (é um Raspberry também);
  18. 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!

1

Muito bom seu relato, sem dúvida agregou bastante!

Trabalhar com sessão do PHP local e não em banco ou de forma descentralizada;

PS: também já sofri desse problema, então migrei o quanto antes possível pra evitar dor de cabeça futura.

1

o simples é melhor que complexo, iniciado em uma vm você vai consegui entende muito melhor os gargalos da sua aplicação do que em um estrutura complexa, também se torna mais fácil de da suporte e ver os acertos e errors, evitaria utiliza serviço destas empresas de clouds para não fica refém de uma.

1
1

eu nao iria de k8s agora, eu colocaria no minimo uma vos com autoscaling pra ter metricas e so entao saber se precisa de um k8s. Mas a aws tem alguns servicos auto escalaveis como o amplify dentre outros.

1

Amplify é proximo ao Cloud Run?
Se for, possivelmente nao vale a pena, pois ele cobra conforme a quantia de uso/node ligado, e ele utiliza websocket então vai mantendo os nodes ligados o tempo todo.

Quando você fala em auto scaling, que estrutura você pensa? Comprar 2 vps e for equilibrando o tráfego entre essas 2?

1