rabbit-example

Exemplo de uma aplicação NodeJs utilizando RabbitMQ

MIT License

Stars
1

Example RabbitMQ - Medium

Artigo no Medium: O que o RabbitMQ, e como utilizar?

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 comunicao entre os servios.

Tpicos 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 prticas de segurana/robustez
  • Como utilizar RabbitMQ na Nuvem

Como rodar o 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.


Como o projeto funciona?

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.


Problemas*

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.