Este projeto foi desenv olvido utilizando NestJS e MongoDB, seguindo a arquitetura hexagonal, conceitos de arquitetura limpa e Domain-Driven Design (DDD). Inclui uma suíte de testes completa com testes unitários, de integração e end-to-end (E2E) utilizando Vitest e Testcontainers. Além disso, há uma suíte de testes de carga em desenvolvimento com K6.
- Node.js
- npm
- Instância MongoDB (para execução sem Docker)
- Docker (para execução com Docker)
-
Clone o repositório:
git clone <URL do seu repositório> cd <nome do repositório>
-
Instale as dependências:
npm install
-
Configure o arquivo
.env
com as variáveisPRODUCTS_SERVICE_URL
eMONGO_URI
conforme o.env.example
. A variávelMONGO_URI
deve conter a URL da sua instância MongoDB. -
Execute a aplicação em modo de desenvolvimento:
npm run start:dev
-
Clone o repositório:
git clone <URL do seu repositório> cd <nome do repositório>
-
Configure o arquivo
.env
com as variáveisPRODUCTS_SERVICE_URL
conforme o.env.example
. -
Execute a aplicação com Docker:
docker-compose up
Para testar todas as rotas da aplicação, você pode utilizar o arquivo client.http incluído no projeto. Siga os passos abaixo:
- Instale a extensão Rest Client do VS Code (humao.rest-client).
- Abra o arquivo client.http.
- Utilize os comandos no arquivo para testar as diferentes rotas da aplicação. O arquivo após a instalação da extensão ficará mais ou menos assim:
Para rodar os testes unitários:
npm run test:watch
Para rodar os testes E2E (
npm run test:e2e
Para rodar toda a suíte de testes e gerar o relatório de cobertura de testes (
npm run test:cov
Utilizei o K6 para realizar testes de carga no sistema.
Clique aqui para ver o script que gera o teste de carga no fluxo de criação de cliente e a adição de proutos aos favoritos
npm run test:load
Nesse teste, o cenário de favoritar um produto fazia com que cada cliente cadastrado favoritasse somente 1 produto! Obtendo um p(95) de 21.92ms
e 65 requisições por segundo
, um resultado ok já que estou rodando tudo na minha máquina (1 instância mongodb, 1 do node)!
No mesmo cenário de favoritar produtos, fiz com que todos clientes favoritassem 100 produtos e não somente 1, isso fez com que aumentassemos a quantidade de requisições de 9164 (ultimo teste) para 76220 (541 req/seg) ! Esse aumento massivo de requisições, fez com que o p(95)
aumentasse de 21.92ms para 190.53ms
Após aplicar algumas melhorias como:
- Adicionar fastify;
- Clusterizar a aplicação;
- Adicionar cache em pontos especificos que o mongodb era acessado;
- Passa nível de log (variável
LOG_LEVEL
) para somente erros.
Essas melhorias causaram drastivas melhorias, onde:
- Aplicação conseguiu aceitar 181988 requisições (1292 req/seg). Antes das melhorias, conseguia aceitar somente 76220 (541 req/seg);
- Abaixou o
p(95)
de 190.53ms para 42.94ms.