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

"me conta, no detalhe, um problema complexo que vc precisou resolver e como resolveu, me fala no passo a passo"

essa é uma pergunta feita no processo seletivo da empresa que trabalho. o que vc traz pra mesa? vc que puxou o problema pra resolver ou entregaram o problema pra vc?

Carregando publicação patrocinada...
1

po, baita pergunta essa, vou formalizar como se estivesse respondendo pra um recruiter:

Com certeza o maior desafio que precisei resolver foi a remodelagem de uma das tabelas principais do core da aplicação, pra melhorar a performance e adequar com uma nova regra de negócio que havia sido validada com o cliente.
Essa tabela (A) reunia informações sensíveis, dentro da aplicação, de cada usuário, haviam diversos "JOINs" para poder condensar tudo e retornar ao front um "extrato" dos dados que o usuário precisava ver.

A complexidade dessa funcionalidade começou quando algumas validações de data e outros campos opcionais que o usuário poderia ter surgiram, assim como, um tipo de perfil específico do qual o usuário pertencia, junto com a possibilidade de "acumular" saldos totais de contas diferentes mas com o mesmo "tipo-de-conta". Porém, na nossa modelagem inicial o perfil do usuário não estava presente em nenhuma das tabelas onde a tabela A consultava para montar o "extrato", então, adicionamos esse campo na tabela A e seguimos o desenvolvimento.

E o desafio ficou ainda maior quando vimos que após alguns testes de carga realizados pela equipe de CS junto com os QAs os "JOINs" estavam detonando a performance fazendo com que estourasse o tempo de execução da função na AWS (Lambda), como cada usuário poderia ter facilmente mais de 5 contas, com mais de centenas de registros em cada, o número de itens por conta por usuário começou a gerar um gargalo. E ai começamos um trabalho extenso de remodelagem de cada tabela relacionada à esse processo (e posteriormente todas as tabelas da aplicação), por se tratar de um banco não-relacional optei por replicar dados da tabela X na tabela A afim de evitar JOINs (ou populates) e também melhoria na lógica de aplicação de filtros para tornar as queries mais eficientes, estudos sobre algorítmo e ED pra ajudar a identificar formas de melhorar processos de inserção e atualização entre outras medidas que foram tomadas. No fim conseguimos reduzir em 20s o processamento dos usuários de teste com dados em grande quantidade oque nos deu segurança de saber que não teríamos timeout no serverless nem em processos de atualização do banco.

Esse problema foi identificado primeiramente pelo meu PO na época e depois levado a testes pela equipe de CS junto aos QAs, e ja que se tratava de uma atividade que eu havia desenvolvido do 0 e já estava entregue, fui o responsável por adequar as queries e a lógica de inserção/atualização junto às melhorias necessárias nas models que esse processo utilizava. Mas como se tratava de um problema que iria impactar em outras partes do produto, nosso tech-lead e o CTO elaboraram um projeto de remodelagem para todo o software onde delegaram as tarefas para os responsáveis ou quem possuía maior conhecimento em partes específicas, tudo aconteceu em paralelo então eu diria que ajudei a identificar o problema a gestão das equipes comunicou oque eu deveria fazer.

1

o que senti falta:
-que banco de dados era esse?
-como eram esses testes de carta? que ferramentas usou?
-qual era o numero total de dados que consultava? 5 contas x algumas centenas não deveria ser problema para um banco nosql.
-qual o tempo de execução da lambda e o timeout? (pergunto para servir de parametro pra entender se os 20 segundos que reduziram é 20 em 30 ou 20 sec em 5 minutos)

está no caminho!

1

Boa! valeu pelos toques, vou prestar atenção nisso e dar uma "ensaiada" na resposta pra entrevistas futuras.

Mas pra esclarecer, utilizamos MongoDB, os testes de carga eram realizados percorrendo todo o caminho que um usuário faria dentro da plataforma, desde criar o login até a função real do produto (que não posso comentar aqui... kkk), mas os dados das contas dos usuarios eram inseridos "na mão" via JSONs gigantescos gerados de forma automatizada pelo CS e importados pra dentro do banco.

Dificil te dar um número fechado mas sei que eram mais de 20k de usuários e cada um deles com pelo menos 50-70 registros em cada conta e por volta de 3 ou 4 contas, um número "realista" de acordo com os POs e CS. As queries também foram bem otimizadas no momento de aplicar os filtros.

E concordo contigo, não era pra dar gargalo, a questão é que a modelagem inicial não contemplava referência extendida quando foi criada bem antes de eu entrar no projeto, oque nos levou a usar muitos lookups e populates, e ai o tempo de requisições ia pro espaço.

Por fim, o timeout era justamente como deu o exemplo, depois 30s aguardando a lambda caía, e ai baixamos pra 10s.