Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vídeo de lançamento conseguiu derrubar a API (mais ou menos) 🤝 #826

Closed
filipedeschamps opened this issue Nov 21, 2022 · 261 comments
Closed

Comments

@filipedeschamps
Copy link
Owner

filipedeschamps commented Nov 21, 2022

Tudo parece que está funcionando como esperado, apesar da instância do banco que utilizamos não estar conseguindo dar conta, tanto por conta do número alto de conexões abertas consumindo o processamento, quanto a dificuldade de conseguir responder a request dentro de 60 segundos antes da lambda cortar a conexão.

A Vercel não está marcando ainda as visitas, mas olhando diretamente os logs, o pico de acesso achatou a parte anterior do gráfico:

image

[edit]

Em paralelo, para quem só está consumindo as páginas (que são estáticas), tudo está 100% 👍

@rodrigoKulb
Copy link
Contributor

rodrigoKulb commented Nov 21, 2022

Acho que realmente estamos com instabilidade no servidor devido a quantidade de acessos!

Parece que chegamos no limite da Vercel para o plano utilizado, ou do DB. Precisamos analisar os logs para achar onde foi o gargalo! Mas é normal pelo tamanho que o Canal possui, sabia que algo assim poderia acontecer.

Captura de tela em 2022-11-21 11-11-14

@devajmeireles
Copy link

image

Não consegui realizar o cadastro ... Não seria uma boa um sistema de OAuth para autenticação geral? 🤔

@Rafatcb
Copy link
Collaborator

Rafatcb commented Nov 21, 2022

Pior que se for se basear pela página Status, o site está saudável, com conexões ainda disponíveis e latência baixa:

Banco de Dados

Status: healthy
Conexões disponíveis: 78
Conexões abertas: 46
Latência: 11ms 3ms 8ms
Versão do PostgreSQL: 14.3

@JonathanArgentao
Copy link

JonathanArgentao commented Nov 21, 2022

Me deparei varias vezes com essa tela ja desde que lançou, sem erro em tela, só no console

image

@filipedeschamps
Copy link
Owner Author

Total! Nesta visualização há um problema, pois se o endpoint que testa o banco de dados não está saudável, ele não consegue retornar. Então eventualmente só vamos conseguir ver a saúde do banco de dados até na ultrapassagem dele não estar mais saudável.

Em paralelo, os alertas pela visão dos logs:

image

@rodrigoKulb
Copy link
Contributor

rodrigoKulb commented Nov 21, 2022

@filipedeschamps consegue acessar o status direto do banco no painel de controle? Com certeza chegamos no limite lá!

Podemos criar uma página estática explicando que o projeto está em fase de desenvolvimento etc... com talvez até um vídeo explicativo. Como uma SALA de espera até o número de conexões normalizar. Vai liberando os acessos conforme o fluxo do banco.

Ou isso ou subir o plano do banco de dados 😅️

@filipedeschamps
Copy link
Owner Author

Total! Quero avaliar subir o banco de dados total! Por que num evento de pico assim é muita request para a instância mínima da AWS:

image

@rodrigoKulb
Copy link
Contributor

rodrigoKulb commented Nov 21, 2022

Engraçado que eu não consigo fazer nada mas o número de novos cadastros não para de subir 😅️

Olha que assunto legal para abordar em um próximo vídeo do canal!

Captura de tela em 2022-11-21 11-50-42

Parece que o insert funciona bem melhor que o select nessas situações.

@filipedeschamps
Copy link
Owner Author

A Vercel acabou de me mandar um email:

image

Imagino que isto esteja se agravando, pois a maioria das lambdas estão consumindo os 60 segundos de execução.

@filipedeschamps
Copy link
Owner Author

1 milhão de requests dentro dos primeiros 60 minutos:

image

@filipedeschamps
Copy link
Owner Author

Por dentro da Vercel:

image

A parte que mais preocupa:

image

@felipsbreno
Copy link

É, só hoje um bom número de cadastros, estamos com 304 agora.

image

@rodrigoKulb
Copy link
Contributor

Subestimou o poder do canal 😅️
O conteúdo estático está rodando normalmente, problema é só com o banco de dados mesmo.
➡️ https://www.tabnews.com.br/museu

@filipedeschamps
Copy link
Owner Author

Vou começar a pagar multa na Vercel 😂

image

Em paralelo, o volume de requests está desacelerando:

image

@Rafatcb
Copy link
Collaborator

Rafatcb commented Nov 21, 2022

Vou começar a pagar multa na Vercel 😂

Esse é o preço do conhecimento hehehe. Mas acho que essa experiência traz insights valiosos que você pode adicionar no curso! Além disso, pode servir para definir uma métrica norte que guiará os próximos passos do projeto, para continuar algo viável.

@peterpaulo-azion
Copy link

Aqui rolou a falha no cadastro também, a request foi de base!

WhatsApp Image 2022-11-21 at 12 25 06

@filipedeschamps
Copy link
Owner Author

To pensando aqui em como conseguir tirar a API do ar sem afetar muito o site, pois se ela não está usável e só gerando custos, isso é uma situação ruim de se colocar.

@felipsbreno
Copy link

Vejo que tem algumas issues sendo abertas referente ao problema que está sendo discutido aqui, não seria melhor deixar está issue em pinned ?

@CarlosZiegler
Copy link

Quais são os serviços que estão sendo usados no momento? Digo qual serviço e para qual finalidade? Talvez possamos repensar algumas estratégias não ?

@CarlosZiegler
Copy link

Poderia colocar quais serviços e os valores pagos, para termos uma noção de custos com o projeto.

@aprendendofelipe
Copy link
Collaborator

Sobre o banco em São Paulo ou Norte da Virgínia... Em SP é o dobro do preço, né?

Só que se mudar o local do banco, é melhor mudar também as lambdas da Vercel para a mesma região.

No uso normal do sistema só seria perceptível um pequeno aumento na latência ao publicar ou votar nos conteúdos e no cadastro/login.

Na navegação pelos conteúdos das primeiras páginas (relevantes ou recentes) não deve ser percebida nenhuma diferença por causa do cache na CDN da Vercel.

Outra questão sobre o banco... Como está a utilização da instância nos últimos dias? Com as otimizações e com a proteção da Cloudflare, ainda é necessário manter essa instância com mais memória? Só mudou a quantidade de memória, né? Se estiver muito subutilizada, talvez compense voltar para a anterior.

@aprendendofelipe
Copy link
Collaborator

aprendendofelipe commented Dec 5, 2022

Poderia colocar quais serviços e os valores pagos, para termos uma noção de custos com o projeto.

Vou colocar aproximadamente o que eu lembro e daí o @filipedeschamps complementa ou corrige se eu errar algo (valores mensais):

Vercel = não sei como ficará com a parceria (era $40 antes do lançamento).
Cloudflare = $20
PostgreSQL (homologação) = $14
PostgreSQL (produção) = $105 ($30 antes do lançamento)
Mailgun = $35
Axiom = $0 ou $99 (acho que $99)
Upstash = Variável (cobrado por comandos de leitura/gravação e por armazenamento)
Backup do banco = ???

Posso estar esquecendo de algo

[Edit] Corrigi os valores do banco, pois tinha calculado com proxy

@rodrigoKulb
Copy link
Contributor

rodrigoKulb commented Dec 5, 2022

Vou tabelar abaixo assim que confirmar com o @filipedeschamps atualizo os valores, tudo mensal?

Serviço Valor
Vercel $ 40,00 / mês
Cloudflare $ 20,00 / mês
PostgreSQL (homologação) $ 14,00 / mês
PostgreSQL (produção) $105,00 / mês
Mailgun $35,00 / mês
Axiom $99,00 / mês
Upstash ??
Backup do banco ??
Total $ 313,00 / mês

@Jetrom17
Copy link

Jetrom17 commented Dec 6, 2022

Então são vocês que estão "afundando os demais que estão hospedado". Brincadeira a parte, sugiro uma campanha para apoiar a causa, seguido com uma boa explicação. Aviso seja dado no YouTube, Discord (não oficial), e-mail e no próprio Tabnews (com dialog se possível).

[Tip]

Screenshot_20221205-205948.png

[Em tradução livre]

Fonte: https://www.vercel-status.com/

Me perdi em alguns comentários, perdoe me se estou repetitivo com outro comentário se existente.

@filipedeschamps
Copy link
Owner Author

Fiz uma publicação bem grande sobre o estado atual do TabNews e os próximos passos: https://www.tabnews.com.br/filipedeschamps/tabnews-atinge-1-5-milhoes-de-views-e-futuro-do-projeto-alerta-de-textao

E conectado ao assunto sobre redução de custo, estava pensando: agora que temos rate-limit direto pela Cloudflare, será que vale a pena removermos a Upstash? Com a Upstash conseguimos fazer um rate-limit customizado por endpoint, coisa que nossa conta atual da Cloudflare não permite (só podemos criar 2 regras). Mas ao mesmo tempo, nossa regra na Cloudflare está com um limite que eu considero baixo e suficiente para barrar e cobrir ataques, sem deixar eles escalarem para um problema maior:

image

Especulo que conseguimos baixar ainda mais e ainda assim fornecer uma API saudável para qualquer client. E decidi expor esses valores aqui, porque é muito fácil de estressar e descobrir eles, seja qual for o valor.

O que acham?

@aprendendofelipe
Copy link
Collaborator

Sobre não passar pelo Upstash todos os endpoints, acho que agora dá pra fazer isso tranquilamente!

Mas não tem nenhum custo fixo e pagamos apenas conforme o uso, certo? Se for isso mesmo, poderia por enquanto manter os códigos e configurações apenas de stand-by para ser mais fácil de voltar a direcionar para o Redis algum endpoint que precisar de atenção especial.

@CarlosZiegler
Copy link

Nao daria para adicionar isso como feature toggle ? E caso precise , ligar ela ?

https://martinfowler.com/articles/feature-toggles.html

@filipedeschamps
Copy link
Owner Author

Mas não tem nenhum custo fixo e pagamos apenas conforme o uso, certo? Se for isso mesmo, poderia por enquanto manter os códigos e configurações apenas de stand-by para ser mais fácil de voltar a direcionar para o Redis algum endpoint que precisar de atenção especial.

Correto, o pagamento é conforme o uso 🤝

Sobre as variáveis de ambiente, podemos deixar lá total. Sobre a parte do código, como podemos fazer esse controle? O que acha de na variável RATE_LIMIT colocar uma chave para "ligar e desligar", conforme sugerido pelo @CarlosZiegler ?

@filipedeschamps
Copy link
Owner Author

@augustoresende conforme combinado, estou removendo os comentários aqui nessa issue, e caso queira conversar de forma privada em [email protected] para calibrarmos uma segunda publicação lá no TabNews, me coloco a 100% de disposição para lhe ajudar, inclusive eu ficaria extremamente feliz que isso acontecesse, combinado? 🤝

Repository owner deleted a comment from CarlosZiegler Dec 7, 2022
Repository owner deleted a comment from augustresende Dec 7, 2022
Repository owner deleted a comment from augustresende Dec 7, 2022
Repository owner deleted a comment from augustresende Dec 7, 2022
Repository owner deleted a comment from augustresende Dec 7, 2022
@aprendendofelipe
Copy link
Collaborator

O middleware vai permanecer pegando todos os caminhos, certo?

Talvez só adicionar algo assim, lá após o condicional que verifica o host:

const listaDeCaminhosLimitados = []

if (!listaDeCaminhosLimitados.includes(request.nextUrl.pathname)) {
  return NextResponse.next();
}

E se for necessário voltar algum endpoint para o Upstash, é só adicionar no array.

@filipedeschamps
Copy link
Owner Author

filipedeschamps commented Dec 7, 2022

Hmm interessante, eu estava pensando em adicionar uma condicional aqui para verificar por aquela chave/feature flag:

async function check(request) {
if (!process.env.UPSTASH_REDIS_REST_URL || !process.env.UPSTASH_REDIS_REST_TOKEN) {
if (!webserver.isLambdaServer()) {
return { success: true };
}

Daí não precisaria mexer em código, seria só em variável de ambiente e forçar um novo deploy.

[edit] mas também não vai dar certo, pois vamos aumentar o escopo do middleware para todos estáticos também.

@aprendendofelipe
Copy link
Collaborator

Daí não precisaria mexer em código, seria só em variável de ambiente e forçar um novo deploy.

A listaDeCaminhosLimitados pode vir das variáveis de ambiente 👍

@aprendendofelipe
Copy link
Collaborator

No PR #1101 fiz uma sugestão de implementação.

Retirei o matcher do config, então o que está valendo é a configuração específica da branch rate-limit-paths-env nas variáveis na Vercel.

Com isso, só para teste, essa versão está com rate-limit do Upstash também no caminho /recentes, além do /api:

https://tabnews-1jscf0m4s-tabnews.vercel.app/recentes

@CarlosZiegler
Copy link

Daria para implementar esse carinha aqui : https://www.getunleash.io

Assim vc tem um painel para ativar/desativar features. Tem plano free para Open Source S2

@aprendendofelipe
Copy link
Collaborator

Daria para implementar esse carinha aqui : https://www.getunleash.io

Assim vc tem um painel para ativar/desativar features. Tem plano free para Open Source S2

Legal esse serviço @CarlosZiegler, mas acho que é muito além do que o necessário para voltar a habilitar o rate-limit do Upstash em algum endpoint específico, se é que vamos precisar fazer isso.

Talvez eu não tenha entendido a melhor maneira de utilizá-lo, pois teríamos que consultar ao Unleash em todas as requisições para verificar se é o caso ou não de passar pelo Upstash.

Então, se entendi direito, vai aumentar o custo ou a latência, ou mesmo os dois.

@CarlosZiegler
Copy link

Então a ideia seria usa run variável de ambiente para ligar/desligar a feature de rate limit ou algo mais crítico, porém essa ferramenta ajuda em demais feature para caso aconteça um pico conseguir desligar features críticas ou algo nesse sentido, como consumo de uma determinada api ou desabilitar comentário etc...

@filipedeschamps
Copy link
Owner Author

Turma, para dar um desfecho sobre o estorno da multa, a Vercel confirmou que não irá estornar e o patrocínio vale somente daqui para frente 🤝

@rodrigoKulb
Copy link
Contributor

A postagem sobre o TabNews atinge 1,5 Milhões de Views bateu 100 tabcoins, isso é um recorde?

Pelo menos o layout não quebrou com 3 dígitos hahaha!

Captura de tela em 2022-12-07 22-16-22

@boemekeld
Copy link

Acompanho o projeto desde o início e gostaria de ter conseguido participar mais.

Peço desculpas se esses pontos já foram discutidos anteriormente, mas dado o cenário atual, e mesmo considerando o patrocinio da Vercel, gostaria de deixar algumas sugestões, pensando na infraestrutura mais a longo prazo.

Sobre o banco SQL - o AWS RDS é robusto (talvez o mais de todos serviços), porém tem algumas desvantagens principalmente quando usado com uma aplicação Serverless. Não sei exatamente como está configurado no caso do TabNews, mas independente disso, mesmo com tudo que a AWS lançou nos últimos anos (Aurora Serverless V2, RDS Proxy, etc), continua não sendo minha primeira opção. Minha sugestão aqui seria substituir por um serviço de banco SQL voltado para serverless, como o PlanetScale. Explico os motivos abaixo:

  • Banco distribuido - com poucos cliques é possível habilitar réplicas (somente leitura) do banco em múltiplas regiões, reduzindo a latência (ao menos de leitura), sem um aumento significativo de custo ou esforço de configuração como na AWS;
  • Branch - o sistema de branch facilita a automação, o CI/CD e o processo de migrations nas alterações na base;
  • Picos de acesso - ambiente criado nativamente para lidar com picos de acesso sem gerar custos absurdos ou deixar de atender requisições;
  • Amigável para ser consumida pelo edge - pode ser utilizado também diretamente da camada Edge (através da fetch API);
  • Custos menores - é claro que isso depende de como a aplicação está programada, mas acredito que o TabNews teria rodado com folga no plano de $29 durante os picos do lançamento;
  • Constante evolução, mais rápida que a AWS, esse ano vimos features importantes sendo lançadas, como o Boost de queries e a replica do banco em outras regiões.

Hospedagem da API
Para termos de comparação de custos, a multa de $40 por 100 GB-Horas da Vercel custaria $6 se fosse paga diretamente a AWS (https://aws.amazon.com/lambda/pricing/ considerando $0.0000166667 por cada GB-segundo), isso sem contar com os 400.000 GB-segundo mensais do free tier ou a economia de 17% que pode ser alcançada com o Compute Savings Plans (pagamento adiantado).
Existem ainda programas de créditos voltados para Startups e projetos Opensource que podem chegar a altos valores (como 10K USD para ser utilizado em 2 anos) que poderiam reduzir muito o custo com a hospedagem da API.
É uma migração um pouco trabalhosa (o painel da AWS é sempre sofrido), porém atualmente existem boas ferramentas para ajudar com isso (como Github Actions e o Serverless Framework). E a parte dos créditos envolve uma certa burocracia, mas pode compensar.

Hospedagem Front-end
Apesar das vantagens da Vercel, como a usabilidade do painel, logs e analytics, recomendaria migrar para o Cloudflare Workers principalmente para ter acesso a outros serviços Edge da Cloudflare (como o KV que poderia ser utilizado para reduzir ou até mesmo eliminar a necessidade do Upstash, diminuindo ainda mais os custos).

Estou na torcida e gostaria de colaborar mais com o projeto, espero que essas sugestões possam ajudar de alguma maneira. Se entenderem que alguma delas faz sentido, certamente conseguirei me envolver mais pois é a minha área 🙂

@filipedeschamps filipedeschamps unpinned this issue Dec 19, 2022
@filipedeschamps
Copy link
Owner Author

filipedeschamps commented Dec 19, 2022

@boemekeld muito legal ver você aqui de novo meu caro, ainda mais com um comentário sensacional como estes! Ontem eu abri o Draft da próxima Milestone e acredito que ficará melhor conversar por lá, pois ela é focada em Performance e Segurança: #1140

Então estou fechando esta issue aqui e MUITO OBRIGADO por todo mundo que participou desta aventura. Espero ter próximas aventuras assim vocês, pois é exatamente deste tipo de situação que os conhecimentos mais raros são acessados... fora que tudo fica mais gostoso quando são vocês que estão aqui 🤝

Por fim, este é o print das views dos últimos 30 dias e agora o projeto entrou num estágio natural e saudável de ficar mais calmo, onde teremos mais tranquilidade para ajustar o que precisa ser ajustado, para daí sim tentar conquistar o próximo crescimento, mas desta vez muito mais preparados 👍 💪 🎉

image


[edit]

Pico de 1.8 milhões de views:

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests