https://github.com/ramonpaolo/rabbit-example
Exemplo de uma aplicação NodeJs utilizando RabbitMQ
https://github.com/ramonpaolo/rabbit-example
amqp medium-article nodejs rabbitmq
Last synced: 5 months ago
JSON representation
Exemplo de uma aplicação NodeJs utilizando RabbitMQ
- Host: GitHub
- URL: https://github.com/ramonpaolo/rabbit-example
- Owner: ramonpaolo
- License: mit
- Created: 2022-05-30T17:00:45.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2023-07-20T13:42:27.000Z (almost 3 years ago)
- Last Synced: 2024-04-14T08:46:02.276Z (about 2 years ago)
- Topics: amqp, medium-article, nodejs, rabbitmq
- Language: TypeScript
- Homepage:
- Size: 281 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Example RabbitMQ - Medium
- [O que é esse projeto?](#o-que-é-esse-projeto)
- [Como rodar o projeto?](#como-rodar-o-projeto)
- [Como o projeto funciona?](#como-o-projeto-funciona)
- [Problemas*](#problemas)
Artigo no Medium: [O que é o RabbitMQ, e como utilizar?](https://medium.com/@ramonpaolo/o-que-%C3%A9-o-rabbitmq-e-como-utilizar-c3ce2406a983)
# O que é esse projeto?
Esse projeto, é fruto de um artigo feito no Medium, para explicar sobre o RabbitMQ.
Nesse projeto, você verá que está sendo utilizado uma arquitetura microservices, onde o RabbitMQ(Message Broker) tem o seu destaque, para fazer a comunicação entre os serviços.
Tópicos abordados no Artigo/Projeto:
- O que é o RabbitMQ e o AMQP?
- Para que utilizar o RabbitMQ?
- Quais empresas utilizam o RabbitMQ?
- Como utilizar o RabbitMQ no NodeJs
- Boas práticas de segurança/robustez
- Como utilizar RabbitMQ na Nuvem
# Como rodar o projeto?
Para rodar o projeto em sua máquina, basta clonar o repositório em sua máquina, e certificar que o Docker Daemon esteja rodando.
```bash
# Clonando o repositório
$ git clone https://github.com/ramonpaolo/rabbit-example.git
# Entrando no projeto
$ cd rabbit-example
# Entrando no serviço
$ cd ./services/consumer
# Instalando as dependências do serviço
$ yarn
# Entrando no serviço
$ cd ../sender
# Instalando as dependências
$ yarn
# Entrando na pasta raiz
$ cd ../..
# Subir os conteiners
$ docker-compose up --build -d
```
Após isso, poderá visitar a URL: [http://localhost/sender/Testando](http://localhost/sender/Testando), onde será enviado a mensagem "Testando", para um tópico do RabbitMQ, onde outro serviço irá ouvir a mensagem.
E poderá visitar a URL: [http://localhost/](http://localhost/), para visualizar os dados recebidos pelo RabbitMQ.
---
# Como o projeto funciona?
Ao fazer requisição GET para o endpoint *"/sender/Message"*, o Express irá receber a requisição, e irá enviar uma mensagem para o tópico "topic", usando o RabbitMQ.
Após o envio da mensagem, o serviço "consumer", irá ouvir(consumir) a mensagem, e salvar a mensagem em um arquivo .txt, para quando for requisitado pelo endpoint "/", o nodejs possa ler o arquivo e entregar o conteúdo para o usuário.
NGINX está sendo utilizado para fazer load balacing dos serviços, podendo assim, fazer quantas replicas de serviço, você desejar.
---
# Problemas*
Não é bem um problema, pois na verdade, é uma solução de um problema, mas não é bem aceito.
Quando se utiliza o RabbitMQ no Docker, ele demora alguns segundos para ficar pronto, e liberar a conexão do servidor RabbitMQ para os outros conteiners. E infelizmente, quando a aplicação NodeJs começa a rodar, o serviço RabbitMQ ainda não ficou totalmente funcional, logo, temos que dar um pequeno "delay" para a aplicação NodeJs se conectar com o RabbitMQ local.
Esse problema poderia ser contornado, podendo utilizar o wait-for-it.sh.
Porem, nesse caso, acabei utilizando o setTimeout(), pois precisei utilizar apenas 2 linhas de código, para solucionar esse problema. Solução simples, que não depende de terceiros(shell script de outros).
Caso o usuário for utilizar o RabbitMQ com a CloudAMQP, não precisa utilizar esse delay na aplicação NodeJs, podendo retirar o setTimeout, sem problemas.
Por padrão, defini o delay do setTimeout(), em 8000ms(8s), para dar tempo para o serviço do RabbitMQ ficar totalmente online e operante.
---


