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