所以情况是我有各种各样的数据源提供来自外部设备的消息流..一些是通过串口发送消息,一些是通过UDP发送,一些是通过Telnet发送..我希望构建一个小的Node.js从每个来源接收消息的系统。大约20个来源全部上升。
我有很多地方可以将这些消息转发给我,我希望允许客户端通过telnet连接并接收这些消息。
我想你可以称之为“服务总线”或“消息总线”。
目前我只是在探讨如何构建它的想法,我不想要一个巨大的node.js文件来完成所有事情。
我希望每个“接收器”都在我的主node.js文件中的外部.js文件中。我的方法是否正常,我可以对我的方法做出任何改进。
主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中构建消息总线的任何其他架构方法的任何评论都是超级的。
谢谢阅读,
邓肯。
这篇文章已有8年历史,问题将得到很好的解决;但是我想我会使用现代Node和Typescript为所有通过这种方式来的人提供一些想法。
正如您所发现的那样,消息总线非常适合。当设备开始发送大量消息时,这有助于不会压倒您的应用程序。
一个干净的方法是使用像@node-ts/bus这样的专用服务总线来处理重试消息,订阅主题等所有技术复杂性。
接下来将为设备生成的消息构建Anti-corruption layer。当他们收到每条消息时,它会被转换为符合您标准的域消息。这将阻止每个消息处理程序在解密消息和操作它们时必须有多个问题。
这是一个较老的问题,所以你可能已经构建了你的解决方案,但我会添加我的看法,以防万一它对某人有用。
保持接收器特定代码隔离的想法对我来说似乎是正确的,它将使读者明白哪些代码与主工作流程相关,哪些代码与特定流相关。
我也很想尝试;
实例化
我发现你处理对象创建的方式有点误导,因为它使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():
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);