NodeJS ZeroMQ-当生产者准备好在连接后发送消息时

NodeJS ZeroMQ - When producer is ready to send message after connection?

本文关键字:消息 连接 ZeroMQ- 生产者 准备好 NodeJS      更新时间:2023-09-26

我对zeromq支持的模式做了一些小的研究。我想描述PUB/SUB模式的问题,但可能我在最近的项目中也发现了PUSH/PULL模式的问题。我使用NodeJS zeromq实现。

我准备了两个例子(server.js和client.js)。我发现每次重新启动服务器时,来自server.js的第一条消息都会丢失(消息每1秒发送一次)。client.js没有得到第一条消息。这可能是由于发送消息前时间过短造成的。当我在一段时间后(例如1秒)开始发送消息时,一切都很好。我认为zmq需要一些时间来初始化发布服务器和订阅服务器之间的连接。

我想知道生产者(服务器)何时准备好为订阅的客户端发送消息。如何获得这些信息?

我不明白为什么连接并订阅消息的client.js没有得到它,因为服务器在重新启动后还没有准备好支持订阅。

也许它是这样设计的。

server.js:

var zmq = require('zmq');
console.log('server zmq: ' + zmq.version);
var publisher = zmq.socket('pub');
publisher.bindSync("tcp://*:5555");
var i = 0;
var msg = "get_status OK ";
function sendMsg () {
    console.log(msg + i);
    publisher.send(msg + i);
    i++;
    setTimeout(sendMsg, 1000);
}
sendMsg();
process.on('SIGINT', function() {
    publisher.close();
    process.exit();
});

client.js:

var zmq = require('zmq');
console.log('client zmq: ' + zmq.version);
var subscriber = zmq.socket('sub');
subscriber.subscribe("get_status");
subscriber.on('message', function(data) {
    console.log(data.toString());
});
subscriber.connect("tcp://127.0.0.1:5555");
process.on('SIGINT', function() {
    subscriber.close();
    process.exit();
});

在节点zmq-lib repo中,您已经声明了支持的监视事件。订阅它将允许您监视您的连接,在本例中为accept事件。但是,不要忘记,您还必须调用套接字上的monitor()函数来激活监视。

你最终应该得到这样的东西:

var publisher = zmq.socket('pub');
publisher.on('accept', function(fd, ep) {
    sendMsg();
});
publisher.monitor(100, 0);
publisher.bindSync("tcp://*:5555");