Date:

Como eu reduzi o tempo de resposta da minha API

Inexperiência

Esse projeto foi feito no início da minha jornada com Java, onde pude aplicar o pouco conhecimento que eu havia adquirido em um projeto real, com pressão real e expectativas reais. Como era minha primeira experiência, fui aprendendo ao longo do projeto e em alguns momentos isso levava a algumas práticas questionáveis, incluindo duas mais impactantes.

Banco de dados

A API foi construída utilizando Java, PostgreSQL e JPA como ORM para facilitar a comunicação com o banco de dados.

Design da API

Devido ao projeto ter um prazo de entrega curto e um MVP muito grande devido a falta de experiência na coleta de requisitos, fui obrigado a tomar algumas decisões de arquitetura que não eram muito escaláveis. A pior decisão foi utilizar o retorno de todos os objetos aninhados partindo do objeto pai. Isso significava que um recurso consultado possuía vários objetos aninhados, e esses objetos também possuíam vários objetos aninhados, até chegar no último objeto possível associado ao recurso. Isso causou um gargalo no processamento de respostas JSON em consultas e outras interações com retorno e, dentre várias outras otimizações, optei por solucionar esse problema aplicando (parcialmente) o princípio HATEOAS, substituindo os recursos aninhados por links relevantes para consultar esses recursos associados. Esse pequeno ajuste garantiu uma escalabilidade maior, já que agora os retornos da API não cresciam exponencialmente.

Solução Definitiva

Após várias otimizações em consultas custosas ao banco de dados, redução de roundtrips da aplicação ao banco de dados utilizando operações em batch e criação de índices no banco de dados, chegou o dia da implantação dessa refatoração. Estava ansioso para testar essas funcionalidades, mas precisava de um teste confiável. Para garantir isso repliquei o banco de dados de produção para o ambiente de stage, abri a aplicação, testei e…

Conclusão

ORM’s são uma ferramenta poderosa, mas você precisa saber muito bem o que está fazendo. Mesmo após dezenas de otimizações, o gargalo em sua maioria estava em uma única propriedade do JPA. Eu obteria o mesmo resultado caso tivesse alterado isso e não realizasse nenhuma outra melhoria? Nunca saberemos.

FAQs

Q: Qual foi o problema principal que você enfrentou no seu projeto?

A: O problema principal foi o alto volume de processamento de JSON em uma só requisição, causado pelo uso de recursos aninhados.

Q: Como você resolveu o problema?

A: Eu resolvi o problema aplicando o princípio HATEOAS, substituindo os recursos aninhados por links relevantes para consultar esses recursos associados.

Q: Qual foi o resultado final?

A: O resultado final foi um tempo de resposta reduzido em 99% para o sistema em produção.

Q: Qual é a lição que você aprendeu com esse projeto?

A: A lição que eu aprendi é que é fundamental saber muito bem o que está fazendo ao trabalhar com ORM’s, pois pequenas alterações podem ter grandes impactos no desempenho do sistema.

Latest stories

Read More

LEAVE A REPLY

Please enter your comment!
Please enter your name here