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

时间:2015-11-12 14:34:49

标签: javascript node.js zeromq publish-subscribe

我对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();
});

1 个答案:

答案 0 :(得分:1)

在节点zmq lib repo中,您已声明supported monitoring events。订阅这将允许您监视您的连接,在这种情况下是accept事件。但是请不要忘记,您还必须在套接字to activate monitoring上调用monitor()函数。

你应该得到类似的东西:

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