nodeJS zeroMQ:为什么不能发送消息如果sock.send不在setInterval

我在nodeJS中使用了zeroMQ。 但是,似乎在将数据从生产者发送给worker的时候,如果我不把它放在setInterval中,那么它就不会把数据发送给worker。 我的示例代码如下所示:

producer.js =========== var zmq = require('zmq') , sock = zmq.socket('push'); sock.bindSync('tcp://127.0.0.1:3000'); console.log('Producer bound to port 3000'); //sock.send("hello"); var i = 0; //1. var timer = setInterval(function() { var str = "hello"; console.log('sending work', str, i++); sock.send(str); //2. clearTimeout(timer); //3. }, 150); sock.on('message', function(msg) { console.log("Got A message, [%s], [%s]", msg); }); 

所以在上面的代码中,如果我加回注释1,2和3中的行,那么我确实收到了消息给工作人员,否则它不起作用。

任何人都可以扔光为什么发送消息我需要把它放在setInterval? 还是我做错了什么?

问题隐藏在node.js的zmq绑定中。 我只是花了一些时间挖掘它,它基本上这样做send():

  1. 排队消息
  2. 冲洗缓冲区

现在问题在冲洗部分,因为它

  1. 检查输出sockets是否准备好,否则返回
  2. 冲洗排队的消息

在你的代码中,因为你调用绑定并立即发送,所以在调用的时候没有工作人员连接,因为他们根本没有足够的时间来注意。 所以这个信息是排队的,我们正在等待一些工人出现。 现在有趣的部分 – 我们在哪里检查新的工人? 在发送函数本身! 所以,除非我们稍后调用send(),实际上有一些工作人员连接起来,否则我们的消息永远不会被刷新,而是永远排队。 这就是为什么setInterval有效,因为工人有足够的时间来注意和连接,并定期检查是否有。

你可以在https://github.com/JustinTulloss/zeromq.node/blob/master/lib/index.js#L277find有趣的部分。

干杯;-)