RabbitMQ and Node.js Hello World

Getting Started

A basic messaging application consists of 3 parts, the Publisher,the Broker, and the Consumer. The Publisher publishes messages to the broker, the broker decides which consumer will receive the message and the consumer processes the message. I have been exploring different kinds of applications that would help me make a robust messaging application. RabbitMQ is loaded with features that allow you to make all sorts of robust messaging patterns so I decided to use RabbitMQ. The following is an example of a basic application that utilizes RabbitMQ as a broker.

Publisher

publisher.js

The publisher.js will create messages and publishes them to RabbitMQ to be brokered.

///RabbitMQ nodejs library
var amqp = require('amqp');

///Create a connection to your RabbitMQ
var connection = amqp.createConnection();

///Connection is ready
connection.on('ready', function() {

  console.log('Server Connected');
  var exchange = conn.exchange('order', {
    type: 'topic', ///This is the type of exchange I want to use
    confirm: true
  }, function() {
    console.log('Exchange connected');
    var i = 0;
    ///Simulating messages being published
    setInterval(function() {
      i++;
      console.log(i)
      exchange.publish('task_queue', 'Hello World! ' + i, {
        durable: true,
      }, function(res) {
        console.log('confirmed ',res);
      });
    }, 1000);
  })
})

Broker

RabbitMQ

The Broker is going to be RabbitMQ.

Install on MacOSX

brew install rabbitmq  

For more detailed instructions follow this link
https://www.rabbitmq.com/install-homebrew.html

Then launch the server in your terminal

rabbitmq-server  

Consumer

consumer.js

Create one more file and call it the consumer.js.
Consumer.js will receive the messages that are brokered by RabbitMQ.

var amqp = require('amqp');  
///connect to rabbitmq
var connection = amqp.createConnection();  
///connection is ready
connection.on('ready', function() {  
///connect to the queue
  connection.queue('task_queue', {
    autoDelete: false,
    confirm: true
  }, function(queue) {
///get the exchange connection
    var exchange = connection.exchange('order', {
      type: 'topic'
    });
///bind the queue to the exchange. THIS IS VERY IMPORTANT
    queue.bind(exchange, 'task_queue')
    console.log(' [*] Waiting for messages. To exit press CTRL+C');
///subscribe to the queue
    queue.subscribe({
      ack: true
    }, function(msg, cb) {
      console.log(cb)
      console.log(" [x] Received %s", msg.data.toString('utf-8'));
      setTimeout(function() {
///Done processing the message.
        queue.shift()
      }, 5000);
    });
  });
});

Everything Working Together

Lets get this application working. Open a terminal and run node against the publisher.js file.

node publisher.js  

If everything was done right, you should see Hello World printed incrementally in your terminal.
Then in another terminal, run node against the consumer.js file.

node consumer.js  

You should see [x] Received Hello World printed incrementally in your terminal. You can also run node against additional consumer.js and you will notice how RabbitMQ redistributes the messages to the new consumers. Pretty cool right?

Enjoy


-->