API REST robusta e escalável desenvolvida para o gerenciamento de catálogo de livros e coleções pessoais (MyBooks). O grande diferencial do projeto está na sua arquitetura orientada à performance, projetada para suportar alta concorrência por meio de cache em memória, paginação inteligente, buscas otimizadas e ambiente totalmente conteinerizado.
O projeto foi submetido a rigorosos testes de carga e estresse utilizando o Grafana K6 (simulando 100 usuários simultâneos em regime de looping por 50 segundos). A análise dos gargalos de infraestrutura direcionou a evolução da API em três fases essenciais:
Inicialmente, a API utilizava o SQLite. Sob estresse, o mecanismo de write-lock (travamento do arquivo físico para escrita) gerou uma fila massiva de requisições pendentes na rota POST /book.
- Resultado: O tempo de resposta disparou para a casa dos segundos, o servidor Node/Express estourou o limite de conexões abertas no SO e a taxa de erro atingiu 16.70% por quedas forçadas (
wsarecv: An existing connection was forcibly closed).
Substituímos o banco de desenvolvimento por um cluster isolado do PostgreSQL via Docker Compose. O Postgres gerencia processos concorrentes com maestria.
- Resultado: A taxa de erro despencou para 0.00% absoluto e o throughput da API aumentou significativamente.
Para blindar as rotas de listagem (GET), implementamos um Middleware de Cache dinâmico no Redis. Ele intercepta a resposta do Express e salva o payload em memória (RAM) utilizando um TTL (Time-To-Live) estratégico. Se a mesma URL (incluindo filtros e paginação) for requisitada, o Redis entrega o dado em milissegundos sem sequer acionar o PostgreSQL.
| Métrica | Cenário A: SQLite (Sem Cache) | Cenário B: PostgreSQL + Redis (Cache Hit) | Evolução |
|---|---|---|---|
| Requisições Processadas | 497 | 3.007 | + 505% mais requisições |
| Taxa de Erro (Falhas) | 16.70% | 0.00% | Estabilidade Total (0 falhas) |
| Tempo de Resposta Médio | 6.04s | 11.12ms | **~ 540x mais rápido** |
| Tempo Máximo P(95) | 12.71s | 19.25ms | Latência ultra-baixa |
- Runtime & Linguagem: Node.js com TypeScript (Tipagem estática e segurança em tempo de desenvolvimento).
- Framework Web: Express.js estruturado com controle fino de Middlewares.
- ORM & Banco de Dados: Prisma ORM integrado ao PostgreSQL 15.
- Camada de Cache: Redis 7 para armazenamento chave-valor de altíssima velocidade.
- Autenticação: Middleware de validação de tokens JWT (Segurança em primeiro nível, operando antes da camada de cache).
- Paginação e Busca Dinâmica: Parâmetros
page,limitesearchviareq.querynativos no Prisma para evitar sobrecarga de memória e permitir paginação leve no banco. - Infraestrutura: Docker e Docker Compose isolando os serviços de API, Banco de Dados e Cache na mesma rede interna.
POST /register- Cria uma nova conta de usuário no sistema.POST /login- Autentica o usuário e gera o token de acesso JWT necessário para as rotas protegidas.
POST /book- Cadastro de novos livros no catálogo global. (Protegido por autenticação).GET /book- Listagem de todos os livros cadastrados com suporte a Paginação e Busca textual (Search). (Rota Otimizada com Redis Cache).
POST /myBook- Vincula um livro do catálogo global à coleção do usuário autenticado. (Protegido por autenticação).GET /myBook- Lista os livros da coleção particular do usuário logado, com suporte a Paginação e Busca textual (Search). (Rota Protegida e Otimizada com Redis Cache).
Detalhe de Implementação: A chave do Redis é gerada dinamicamente com base na URL completa da requisição (
cache:${req.originalUrl}). Isso garante que pesquisas por?search=clean+code&page=1tenham caches completamente independentes de?search=typescript, evitando vazamento ou mistura de dados.
- Ter o Docker e o Docker Compose instalados na máquina.
- Clonar o repositório:
git clone [https://github.com/Daniel13s/book-keep.git](https://github.com/Daniel13s/book-keep.git) cd nome-do-repositorio