Este projeto consiste em um sistema de mensageria assíncrona utilizando NestJS e RabbitMQ, dividido em duas partes:
- Producer: Responsável por enviar ordens (orders) ao consumer.
- Consumer: Processa as ordens recebidas e envia uma requisição
PATCH
para uma rota de atualização do status de ordem no producer.
├── producer/
│ └── src/
│ └── order/
│ └── dto/
│ └── entities/
│ └── order.controller.ts # Rota para receber updates do consumer e client
│ └── order.service.ts
│ └── order.module.ts
├── consumer/
│ └── src/
│ └── rabbitmq.controller.ts # REcebimento de order
│ └── rabbitmq.service.ts # Processamento das ordens recebidas
│ └── package.json # Dependências e scripts do consumer
│ └── Dockerfile # Dockerfile para configurar o RabbitMQ
│ └── docker-compose.yml # Configuração do RabbitMQ com Docker
O projeto é composto de duas aplicações separadas:
-
Producer:
- O producer envia uma order para o RabbitMQ.
- A order é consumida pelo Consumer e, quando processada, o Consumer realiza uma requisição
PATCH
para atualizar o status dessa order no producer.
-
Consumer:
- O Consumer é responsável por processar as orders recebidas do RabbitMQ.
- Uma vez processada, o consumer realiza uma requisição
PATCH
para a rota de atualização de status do Producer.
- NestJS: Framework para construir aplicações Node.js escaláveis.
- RabbitMQ: Sistema de mensageria utilizado para comunicação entre o producer e o consumer.
- Docker: Utilizado para rodar uma instância do RabbitMQ no ambiente do consumer.
-
Navegue até a pasta
producer
:cd producer
-
Instale as dependências:
npm install
-
Inicie o servidor do Producer:
npm run start:dev
-
Navegue até a pasta
consumer
:cd consumer
-
Instale as dependências:
npm install
-
Para iniciar o RabbitMQ com Docker, execute o seguinte comando:
npm run start:docker-dev
-
Em seguida, inicie o backend do Consumer:
npm run start:dev
- O Producer envia uma order para a fila do RabbitMQ.
- O Consumer consome essa ordem, a processa e, quando terminado, realiza uma requisição
PATCH
para o Producer, atualizando o status da ordem.
- POST /order/: Cria uma order e envia para processamento
- Exemplo de Payload:
{ "customerId": "1", "totalAmount": 200.00, "status": "PENDING" }
- Exemplo de Payload:
- PATCH /order/:id: Atualiza o status de uma order processada.
- Exemplo de Payload:
{ "status": "COMPLETED" }
- Exemplo de Payload:
- O Consumer escuta automaticamente a fila de orders do RabbitMQ e processa as ordens conforme elas chegam.
- O Consumer já vem configurado com um Dockerfile e um docker-compose.yml para subir uma instância do RabbitMQ.
- Para rodar o RabbitMQ via Docker, basta utilizar o comando:
npm run start:docker-dev