Javascript 架构查询。。使用Node.js构建服务/消息总线

Javascript 架构查询。。使用Node.js构建服务/消息总线,javascript,node.js,commonjs,Javascript,Node.js,Commonjs,所以情况是,我有各种各样的数据源,它们提供来自外部设备的消息流。。有些通过串行端口发送消息,有些通过UDP,有些通过Telnet。。我希望构建一个小型Node.js系统,用于接收来自每个源的消息。大约有20个消息来源 我有各种各样的地方,然后我想将这些消息转发到这些地方,我希望允许客户端通过telnet连接并接收这些消息 我想你可以称之为“服务总线”或“消息总线” 目前我只是在讨论如何构造它,我不想要一个巨大的node.js文件来完成所有的事情 我希望每个“接收者”都位于main node.js

所以情况是,我有各种各样的数据源,它们提供来自外部设备的消息流。。有些通过串行端口发送消息,有些通过UDP,有些通过Telnet。。我希望构建一个小型Node.js系统,用于接收来自每个源的消息。大约有20个消息来源

我有各种各样的地方,然后我想将这些消息转发到这些地方,我希望允许客户端通过telnet连接并接收这些消息

我想你可以称之为“服务总线”或“消息总线”

目前我只是在讨论如何构造它,我不想要一个巨大的node.js文件来完成所有的事情

我希望每个“接收者”都位于main node.js文件的外部.js文件中。。我的方法是否符合要求?我的方法是否有任何改进

Main Node.js文件

拉进两个“接收器”。。其中每一个都将处理来自数据源的传入消息

var sys = require("sys");

AVLReceiver = require("./avlreceiver.js").AVLReceiver();
PagerReceiver = require("./pagerreceiver.js").PagerReceiver();
pagerreceiver.js-示例消息接收器

从串行端口接收消息

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;
};
这是分解node.js系统的合适方法吗?我们也非常感谢您对javascript的任何评论。。此外,对于在NoDE.js中构建消息总线,我应该考虑的任何其他架构方法都将是超级的。

谢谢你的阅读


邓肯。

这是一个老问题,所以您可能已经构建了您的解决方案,但我将添加我对它的看法,以防它对某人有用

对我来说,保持特定于接收者的代码隔离的想法显然是正确的,它可以让读者清楚地知道哪些代码与主工作流相关,哪些代码与特定流相关

我也很想尝试

  • 如果可能的话,给你所有的接收器相同的接口,这样主代码就简单了
  • 可能使用EventEmitter来触发更高级别的应用程序代码可以捕获的事件
  • 将配置(如串行端口和波特率)外部化到每个应用程序或每个环境配置文件。节点的模块系统会自动检查“~/Node\u modules”,这样您就可以将每个环境配置放在其中,以避免在部署新代码时被覆盖
  • 我很想看看您的模块导出其功能的方式,见下文
实例化

我发现您处理对象创建的方式有点误导,因为它使exports.PagerReceiver()看起来像一个类构造函数,而事实并非如此;在本例中,它返回一个单例对象。模块本身已经是一个单例实例,因此这有点多余,可能会产生误导

下面的示例说明了对require()的多个调用实际上是如何引用同一个私有变量i

counter.js

var i = 0;

exports.iterate = function(){
    return i++;
};
test.js

var counter1 = require('./counter');
var counter2 = require('./counter');
console.log(counter1.iterate());
console.log(counter2.iterate());
console.log(counter1.iterate());
console.log(counter2.iterate());
输出:

0
1
2
3
除了使用require()而不是require()调用外,以下代码更简单,功能相同。PagerReceiver()


这个职位已经8年多了,问题会得到很好的解决;但我想我会顺便为任何通过这种方式来的人介绍一些使用现代节点和打字脚本的想法

正如您所发现的,消息总线非常适合。当设备开始发送大量消息时,这有助于避免淹没应用程序

一个干净的方法是使用一个专用的服务总线,它可以处理重试消息、订阅主题等所有复杂的技术问题


下一步是为设备生成的消息构建一个。当他们收到每条消息时,它将被转换为符合您的标准的域消息。这将避免每个消息处理程序在破译消息和处理消息时都会有多重顾虑。

我发现了佩德罗·泰泽拉的优秀图茨。。特别是Node.JS modules()上的一个,我觉得用这种方法向前发展更有信心。我觉得很好,但要注意,您创建的是单例,这意味着您不能创建多个PagerReciever实例,除非有多个requiresOrry for the late answer accept。。非常感谢。很有洞察力。邓肯。
var serialport = require("serialport");
var sys = require("sys");

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

var port = new serialport.SerialPort("/dev/ttyS0", { 
    parser: serialport.parsers.readline("\n"), baudrate: 57600 
});

port.on("data", exports.processMessage);