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

[ HELP ] Se voce trabalha com Back-End ou com Analise de dados me ajude!

Acordei com um pesadelo em forma de planilha.

Recebi um stress test hoje cedo e, pra minha surpresa, tudo vermelho, Tempos de resposta entre 10s e 20s e uma avalanche de erros 400.

Se você já é macaco velho, pleno/sênior da vida, me conta

  • como você lida com múltiplas requisições GET em uma base com mais de 450 mil registros?
  • Como você estrutura suas consultas?
  • Cacheia tudo? Usa debounce? Indexa melhor o banco?

No meu caso, estou usando Prisma como ORM, e sinto que parte da dor vem daí. Estou trabalhando nos índices agora, mas queria saber de vocês:

O que fariam diferente pra aguentar o tranco de centenas de requisições simultâneas sem afundar tudo?

Carregando publicação patrocinada...
1

Identifica quais queries estão causando gargalo, verifique se você precisa de fato retornar todos os dados que ela está retornando se não reduza, verifique se os joins são de fato necessários se houver algum e remova se não forem e execute um explain analyze para entender se a query esta usando os indices corretamente caso existam, se não existirem adicione indices nas colunas que fizerem sentido.

Outro ponto o prisma quis reinventar a roda como ORM utilizando a própria lógica nos joins e na forma que ele constroi as queries, em resumo ele
vai fazer as queries de forma encadeada ao invés de usar joins explicitos o que causa esses problemas de performance, as versões mais recentes permitem que você passe uma prop para indicar que quer que ele use joins explicitos.

esses primeiros passos vão dar um norte e possivelmente resolver maior parte dos problemas, além disso considere trocar o prisma por outro ORM e também reveja sua modelagem de dados para entender se ela não pode ser a raiz dos problemas de performance.

1

Fala mano, ontem eu isolei todas as consultas para ter um parâmetro melhor de por onde vinha esse gargalha, era uma tabela que tinha dados de CEP, percebi que talvez o strees test crie um cenário muito ilusório, ele envia 20+ requisições ao mesmo tempo acredito que isso colabore, eu estou passando tudo para queryraw fazendo a mão as consultado SQL no prisma.

você tá certo sobre ele reinventar a roda sksksks.

1
1

O que fariam diferente pra aguentar o tranco de centenas de requisições simultâneas sem afundar tudo?

Sinceramente essa quantidade de dados não é "tranco". Alguma implementação está muito errada.

Alguns passos que podem ajudar:

Querys N + 1

Esse aqui é certamente o MAIOR pesadelo de todo desenvolvedor.

function calcOrderPrice(order: Order) {
    let price = 0
    for(item in order.items) {
        price += **item.product.price**
    }
}

Nesse código cada product vai ser carregado dentro do for. Se o carrinho tiver 50 itens, serão mais de 50 querys no DB.

Profiler

Todo código em produção deveria ter uma ferramenta de instrumentação para dizer exatamente onde está o gargalo. Quais são os métodos que consomem mais recursos ou demoram mais para executar? o que eles tem em comum? Quantas chamadas E/S cada método tem? Qual é o recurso que está gargalando? é DB? é a instância da aplicação?

Disclaimer

Se você já é macaco velho, pleno/sênior da vida, me conta

Você é iniciante e está sozinho no projeto? Se sim, você trabalha para uma empresa? não há alguém mais experiente na sua empresa que você possa pedir ajuda?

1

Fala Pilati, então mano ontem passei o dia isolando a aplicação, já tinha +/- ideia de onde era o problema, a tabela CEP alocava todos os dados de endereços, 450K registros que a cada consulta fazia um 'contains' + 'insensitive' e retornava um 'take 10', coloquei index na tabela para ajudar na consulta e fiz SQL Puro no queryRaw do prisma, ajudou de forma considerável.

Sobre o projeto eu estou migrando ele de uma LANG para outra, e o schema foi me passado sem revisão vou ter que alterar muita coisa nela.

Aliás eu acredito que o strees test foi um grande colaborador para essa dor de cabeça, ele fazia todas consultas simultaneamente sem delay ou espera, era 20 Usuários ou mais enviando req diferentes para o mesmo endpoint.

1

Sabendo o endpoint com problema e o problema sendo realmente no BD (a resposta do BD é devolvida direto ou algo é feito antes?), você pode imprimir o SQL gerado pelo ORM para a consulta e analisá-lo.

  • analisar os joins criados (atributos com EAGER podem gerar joins desnecessários)
  • analisar opções para otimizar (criação de índices, views, etc)
1

Fala masm, cara o prisma tenta recriar a roda e aprendi isso da pior forma kkkkkk, eu adicionei index na tabela e fiz as consultas com SQL Puro acredito que melhorou muito, percebi um problema oculto a forma que fizeram o strees test matava o sistema, ele enviava 20 consultas ou mais ao mesmo tempo para o mesmo endpoint trocando só o parâmetro, então o sistema tomava KO com tanta req no mesmo segundo e pedindo cep diferentes

1

Não conheço o Prisma (só o nome mesmo), já usei mais o Hibernate, mas fico pensando que talvez o Prisma estava gerando problema por causa de algo na modelagem. Fica este ponto para ser analisado e talvez melhorado

1

Meus 2 cents,

Olha, centenas de requisicoes e 450k registros nao deveriam causar todo este problema (um SQLite em maquina local daria conta sem maiores dificuldades).

O que voce precisa olhar:

  1. Qual a requisicao / endpoint que causa mais problemas ? Ou seja, o acesso ao recurso/pagina/etc X eh o problematico.

Ai voce pega este endpoint, tira os acessos a banco e testa novamente - e ve se normalizou. Sim, repoe o acesso a 1 tabela. Testa. Tudo OK, vai para a proxima tabela e assim sucessivamente ate achar o ponto exato que causa o stress.

Achou ? Analise se pode ser uma questao de falta de indice, SQL (peca para mostrar e fazer o explain do SQL gerado - full search eh ruim)

Existem formas mais limpas de fazer isso - mas assim de bate pronto e sem recorrer a ferramentas especificas de analise, eh um caminho.

2

Fala Oletros tranquilo papi? Eu isolei a aplicação e achei o endpoint, o stress test enviava 20 req get para o endpoint de CEP pedindo cidades diferentes ao mesmo tempo então dava um k.o, eu coloquei índices para ajudar na consulta e troquei o select para minimizar consumo.

Obrigado pela contribuição isso e de grande valia, pude entender melhor algumas coisas como o propio full search que também mudei.