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

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

我对 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 库库中,您已经声明了 supported monitoring events. Subscribing to this will allow you to monitor your connection, in this case the accept event. However don't forget that you'll also have to call the monitor() function on the socket to activate monitoring

你应该得到这样的结果:

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