nodeJS zeroMQ:如果sock.send不在setInterval中,为什么无法发送消息

时间:2013-01-03 11:50:08

标签: node.js zeromq

我在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中?或者我做错了什么?

1 个答案:

答案 0 :(得分:2)

问题隐藏在node.js的zmq绑定中。我刚刚花了一些时间深入研究它,它基本上是在send()上进行的:

  1. 将消息排入队列
  2. 冲洗缓冲区
  3. 现在问题在于刷新部分,因为它确实

    1. 检查输出插座是否准备就绪,否则返回
    2. 刷新排队的消息
    3. 在你的代码中,因为你调用bind并立即发送,所以在通话时没有连接工作人员,因为他们根本没有足够的时间注意到。所以消息被排队,我们正在等待一些工人出现。现在有趣的部分 - 我们在哪里检查新员工?在发送功能本身!因此,除非我们稍后调用send(),否则当实际连接了一些工作程序时,我们的消息永远不会被刷新并且它们会永久排队。这就是setInterval工作的原因,因为工人有足够的时间注意和连接,你定期检查是否有。

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

      干杯; - )