Skip to content
Advertisement

Architecture query.. Building a service/message bus with Node.js

So the situation is that I have a variety of datasources that are providing a stream of messages from external devices.. some are sending messages on a serial port, some via UDP, some via Telnet.. I wish to build a small Node.js system that receives messages from each of these sources. Around 20 sources all up.

I have a variety of places that I then want to relay these messages out to, and I wish to allow clients to connect via telnet and receive these messages.

I guess you could call it a “service bus” or a “message bus”..

At the moment I’m just kicking around ideas for how to structure it, I dont want one huge node.js file that does everything..

I want each of the “receivers” to be in external .js files to my main node.js file.. Is my approach below OK and are there any improvements I could make to my approach.

Main Node.js file

Pulls in two “receivers”.. each of these will process incoming messages from a datasource

var sys = require("sys");

AVLReceiver = require("./avlreceiver.js").AVLReceiver();
PagerReceiver = require("./pagerreceiver.js").PagerReceiver();

pagerreceiver.js – a sample message receiver

Receives messages from a serial port..

var serialport = require("serialport");
var sys = require("sys");

var PagerReceiver = {};

PagerReceiver.initializePort = function () {
    this.serialport = new serialport.SerialPort("/dev/ttyS0", { 
        parser: serialport.parsers.readline("n"), baudrate: 57600 
      });

    this.serialport.on("data", this.processMessage);
};

PagerReceiver.processMessage = function (data) {
  //deal with the message
};

PagerReceiver.initializePort();

exports.PagerReceiver = function() {
       return PagerReceiver;
};

Would this be an appropriate way to break up a node.js system? Any comments on the javascript also gratefully received.. Also any comments on any other architectural approaches I should consider for building a message bus in node.js would be super.

Thanks for reading,

Duncan.

Advertisement

Answer

This post is over 8 years old and the problem would be well and truly solved; but I thought I’d drop in some ideas using modern Node and Typescript for anyone who comes by this way.

A message bus is a really good fit as you found out. This helps to not overwhelm your application when the devices start sending out large volumes of messages.

A clean way to approach this would be to use a dedicated service bus like @node-ts/bus that deals with all the technical complexities of retrying messages, subscribing to topics etc.

The next would be to build in an Anti-corruption layer for the messages generated by the devices. When each message is received by them, it’s translated into a domain message that conforms to your standards. This will prevent each message handler from having to have multiple concerns around deciphering messages and actioning them.

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement