Introdução
Dando continuidade a minha serie de artigos sobre RabbitMQ, hoje irei apresentar uma de suas formas de implementação, os workers. Caso tenha interesse em saber um pouco mais sobre os Workers ou ler os primeiros artigos dessa série, eu recomendo a leitura dos artigos abaixo:
Para que você possa ter um melhor entendimento, eu irei criar um exemplo utilizando o Node.js e o RabbitMQ dentro de um container Docker.
O primeiro passo é ter o RabbitMQ instalado, como mencionado acima eu irei utilizar o RabbitMQ dentro de em um container Docker. Caso você ainda não tenha esse ambiente, eu recomendo a leitura do segundo link que eu passei acima, la eu demonstro como criar esse ambiente.
Criação do projeto
Abra um terminal no seu computador, em seguida escolha um local para criação do seu projeto. Navegue até ele via terminal e execute o comando abaixo:
npm init -y
Esse comando irá inicializar o seu projeto criando um arquivo chamado package.json. Agora vamos baixar o pacote do RabbitMQ. Para isso, execute o comando abaixo no seu terminal:
npm install amqplib --save
Com o projeto criado e a biblioteca do amqplib importada, vamos criar dois novos arquivos no nosso projeto.
O primeiro será o arquivo da nossa aplicação, para esse artigo eu irei chamar ele de app.js. Crie ele na raiz do seu projeto, em seguida atualize ele com o trecho de código abaixo:
var amqp = require('amqplib/callback_api'); amqp.connect('amqp://localhost:5672', function (err, conn) { conn.createChannel(function (err, ch) { var q = 'hello'; var msg = 'Hello World 123!'; ch.assertQueue(q, { durable: false }); ch.sendToQueue(q, new Buffer(msg)); console.log(" [x] Sent %s", msg); }); setTimeout(function () { conn.close(); process.exit(0) }, 500); });
Analisando o código acima você tem:
- 1: importação da biblioteca amqplib
- 3: conexão com o RabbitMQ
- 4: criação de um novo canal
- 5: nome do canal
- 6: msg default para ser enviada
- 7: passando o nome da fila para conexão do RabbitMQ
- 8: O RabbitMQ trabalha com Buffer, estou passando a msg para ele e para qual fila ela deve ser enviada
Agora vamos criar os nossos Workers. Para isso, crie um novo arquivo chamado worker.js na raiz do seu projeto e atualize ele com o seguinte trecho de código:
var amqp = require('amqplib/callback_api'); amqp.connect('amqp://localhost:5672', function (err, conn) { conn.createChannel(function (err, ch) { var q = 'hello'; ch.assertQueue(q, { durable: false }); ch.prefetch(1); console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q); ch.consume(q, function (msg) { console.log(" [x] Received %s", msg.content.toString()); }, { noAck: true }); }); });
Analisando esse código você tem:
- 1 a 7: as mesmas configurações que no app.js
- 10 a 12: escutando a fila que foi mencionada na linha 5 e processando ela
Testando o código
Agora para testar o nosso código, abra 3 terminais no seu computador, navegue até o seu projeto e siga os passos abaixo:
Terminal 01
Execute o comando abaixo para criar o seu primeiro worker:
node worker.js
Terminal 02
Execute o comando abaixo para criar o seu segundo worker:
node worker.js
Terminal 03
Execute o comando abaixo para criar a sua aplicação e enviar a primeira mensagem para sua fila.
Obs.: O RabbitMQ trabalha com o conceito de Round Robin, logo o worker 1 pode não ser o primeiro a consumir a sua fila
node app.js
Abaixo você tem um vídeo demonstrando esse passo:
O intuito desse artigo foi demonstrar como trabalhar com os Workers do RabbitMQ utilizando o Node.js. Caso tenha interesse em baixar o código desenvolvido nesse artigo, segue o seu link no meu GitHub: Node-RabbitMQ-Workers.
Espero que tenham gostado e até um próximo artigo pessoal.