Requisições de APIs até 85% mais rápidas
Como fazer as requisições GET de uma API RESTful retornarem um resultado em poucos milissegundos? Siga os passos abaixo e aplique no seu projeto em 15 minutos no NestJS ou replique a estratégia em outras stacks.
A grande responsável pelo resultado é a memória. De forma inteligente, vamos deixar alguns recursos prontos para serem usados, caso sejam buscados mais de uma vez na API, sem comprometer a validade da informação. De vários bancos de dados em memória existentes, o Redis é o mais conhecido e um dos mais utilizados, por isso foi o escolhido para ser usado no projeto. Resultados no final do artigo.
1) Instale e inicie o redis em seu servidor
Veja esse rápido tutorial para instalar e executar redis no linux https://redis.io/topics/quickstart
2) Conecte o seu projeto com o servidor do Redis
No módulo principal do seu projeto, registre com o CacheModule as credenciais do Redis, a porta 6379 é a padrão. Ttl (Time to live) é o tempo em que salvamos um objeto na memória. Podemos sobrescrever esse tempo em cada rota, mas o padrão foi setado como 10 segundos.
Em “providers”, você pode injetar o Cache em todos os controllers automaticamente, ele irá utilizar o cache apenas nas rotas de GET.
3) Analise o contexto de cada rota da sua API
O tempo de cache é um fator muito importante que deve considerar principalmente duas coisas: tempo de processamento da requisição e quão crítico é o dado fornecido. Dois casos (GET) em um marketplace: Estoque de um produto e lista com produtos mais vendidos na loja. A primeira rota, do estoque, exige um baixo tempo de processamento e é extremamente crítico, deve estar sempre atualizada. A segunda, que retorna a lista de produtos mais comprados, exige mais tempo de processamento e o atraso em refletir a ordem “real” não influencia em nenhum aspecto o propósito da rota, já que o objetivo é apenas trazer produtos com maior probabilidade de interesse pelo consumidor, não um ranking em tempo real para métricas do administrador da loja. Podendo ficar por longos segundos ou até minutos.
Com o decorator @CacheTTl(), o tempo padrão do cache de 10 segundos é alterado para 60 segundos na rota ‘produtos/menu’.
Pronto. A sua API já está utilizando Redis e se tornando mais rápida para seus usuários, com retornos quase instantâneos de dados e com uma consequência muito importante: deixando o seu banco de dados livre para processar as requisições de create e update. Eliminando custos com máquinas mais caras.
O Nest conta com várias outras abstrações para gerenciar o cache e realizar estratégias mais abrangentes, como deletar o objeto da memória após a alteração ou criação de uma entidade. Pode conferir em https://docs.nestjs.com/techniques/caching.
Resultados
Antes do Cache: 1399ms (1.39s)
Depois do cache: 198ms (0.19s) — Redução de quase 86%
Média de 5 requisições:
Antes do cache
1ª - 1399ms
2ª - 1500ms
3ª - 1297ms
4ª - 2051ms
5ª -1384ms
Média simples: ~1526ms
Depois do cache
1ª -1411ms
2ª -198ms
3ª -218ms
4ª -315ms
5ª -208ms
Média simples: 470ms (redução de quase 70%)
O tempo mínimo de requisição depende muito do servidor na qual a aplicação está hospedada. Nesse caso, é uma ec2 micro na região de Ohio, Estados Unidos. Caso estivesse em São Paulo, os resultados seriam ainda mais expressivos.