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 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
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.
# 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, 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/, para visualizar os dados recebidos pelo RabbitMQ.
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.
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.