Desafio Back-End Developer
- Node.js
- PostgreSQL
- Sequelize (ORM)
- Docker
Este projeto foi desenvolvido para implementar um sistema de mensagens, garantindo consistência, controle de concorrência e eficiência na distribuição das mensagens. Durante o desenvolvimento, utilizei boas práticas para a modelagem do banco de dados e gestão de dados, sempre focando em escalabilidade e manutenibilidade.
O banco de dados foi modelado usando Sequelize com suporte a migrations, permitindo que o esquema do banco evolua de maneira controlada e consistente entre diferentes ambientes. A modelagem principal envolve duas tabelas:
- Clientes: Armazena as informações dos pagadores e recebedores.
- Mensagens: Armazena as mensagens e cria relações com os dados dos pagadores e recebedores, que são gerenciados como chaves estrangeiras na tabela de mensagens.
O projeto está organizado da seguinte forma:
- O arquivo
index.js
é responsável por configurar a aplicação, carregar as rotas da API e iniciar o servidor.
- As rotas estão configuradas para gerenciar as operações da API e redirecionar as requisições para os respectivos controllers.
- Os controllers são responsáveis por receber os dados das requisições HTTP, processá-los e enviá-los para os services.
- Os services contêm a lógica de negócio principal. É onde acontece o processamento das mensagens e o gerenciamento dos coletores.
O mensagemService.js
possui métodos fundamentais para o funcionamento da aplicação, como:
- Controle de Coletores Ativos: Garante que existam no máximo 6 coletores para cada ISPB.
- Controle de Conflitos: Evita condições de corrida entre as chamadas.
- Distribuição de Mensagens: Garante que as mensagens sejam distribuídas de forma eficiente e que não sejam processadas mais de uma vez.
-
iterationIds
: Armazena os IDs de iteração para cada ISPB. Esses IDs garantem que as mensagens sejam processadas de forma única para cada sessão de monitoramento. -
messageAssignments
: Controla as mensagens já atribuídas a um coletor específico para evitar duplicidade no processamento. -
pullNextUris
: Armazena o próximo URI a ser chamado caso não haja mensagens disponíveis, mantendo a continuidade da conexão de streaming. -
activeCollectors
: Mantém uma lista de coletores ativos para cada ISPB, com um limite de 6 coletores por ISPB. Isso ajuda a gerenciar a carga e garantir que o sistema opere dentro das restrições.
O projeto está configurado para rodar com Docker Compose, incluindo a aplicação e o banco de dados PostgreSQL. As migrations serão aplicadas automaticamente durante o processo de inicialização do container.
-
Clone o repositório:
git clone https://github.com/Henrique-Rmc/desafioBackend.git cd desafioBackend
-
Execute o projeto:
docker-compose up --build
Com isso, o projeto estará rodando em http://localhost:3000
.
-
Gerar Mensagens Aleatórias (POST):
POST http://localhost:3000/api/util/msgs/32074987/5
-
Iniciar Stream com Multipart (GET):
GET http://localhost:3000/api/pix/32074987/stream/start - Headers: Accept: multipart/json
-
Iniciar Stream Sem Multipart (GET):
GET http://localhost:3000/api/pix/32074987/stream/start
-
Parar o Stream (GET):
GET http://localhost:3000/api/pix/32074987/stream/stop
Para facilitar os testes das rotas, incluí um arquivo de script JSON compatível com o Insomnia, que contém todas as requisições configuradas. Esse arquivo está localizado na raiz do projeto com o nome rotas_insomnia
.
Para usá-lo:
- Abra o Insomnia.
- Vá até Application > Import/Export > Import Data > From File.
- Selecione o arquivo
rotas_insomnia
e importe.
Isso irá configurar automaticamente todas as rotas mencionadas acima no Insomnia, prontas para serem testadas.
Esse projeto foi uma excelente oportunidade para explorar o desenvolvimento de APIs escaláveis com Node.js e PostgreSQL. A organização das responsabilidades e a implementação das boas práticas no controle de coletores e distribuição de mensagens foram os principais focos deste desafio.
Espero que isso esteja em conformidade com o que vocês esperavam! Agradeço por seu tempo validando meu projeto!