Exemplo de uma aplicação NodeJs utilizando RabbitMQ
MIT License
Artigo no Medium: O que o RabbitMQ, e como utilizar?
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 comunicao entre os servios.
Tpicos abordados no Artigo/Projeto:
Para rodar o projeto em sua mquina, basta clonar o repositrio em sua mquina, e certificar que o Docker Daemon esteja rodando.
# Clonando o repositrio
$ git clone https://github.com/ramonpaolo/rabbit-example.git
# Entrando no projeto
$ cd rabbit-example
# Entrando no servio
$ cd ./services/consumer
# Instalando as dependncias do servio
$ yarn
# Entrando no servio
$ cd ../sender
# Instalando as dependncias
$ yarn
# Entrando na pasta raiz
$ cd ../..
# Subir os conteiners
$ docker-compose up --build -d
Aps isso, poder visitar a URL: http://localhost/sender/Testando, onde ser enviado a mensagem "Testando", para um tpico do RabbitMQ, onde outro servio ir ouvir a mensagem.
E poder visitar a URL: http://localhost/, para visualizar os dados recebidos pelo RabbitMQ.
Ao fazer requisio GET para o endpoint "/sender/Message", o Express ir receber a requisio, e ir enviar uma mensagem para o tpico "topic", usando o RabbitMQ.
Aps o envio da mensagem, o servio "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 contedo para o usurio.
NGINX est sendo utilizado para fazer load balacing dos servios, podendo assim, fazer quantas replicas de servio, voc desejar.
No bem um problema, pois na verdade, uma soluo de um problema, mas no bem aceito.
Quando se utiliza o RabbitMQ no Docker, ele demora alguns segundos para ficar pronto, e liberar a conexo do servidor RabbitMQ para os outros conteiners. E infelizmente, quando a aplicao NodeJs comea a rodar, o servio RabbitMQ ainda no ficou totalmente funcional, logo, temos que dar um pequeno "delay" para a aplicao 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 cdigo, para solucionar esse problema. Soluo simples, que no depende de terceiros(shell script de outros).
Caso o usurio for utilizar o RabbitMQ com a CloudAMQP, no precisa utilizar esse delay na aplicao NodeJs, podendo retirar o setTimeout, sem problemas.
Por padro, defini o delay do setTimeout(), em 8000ms(8s), para dar tempo para o servio do RabbitMQ ficar totalmente online e operante.