2

我在 nodeJS 中使用 zeroMQ。但似乎在将数据从生产者发送到工作人员时,如果我不将其放入 setInterval 中,则它不会将数据发送给工作人员。我的示例代码如下:

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 中?还是我做错了什么?

4

1 回答 1

2

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

  1. 将消息排入队列
  2. 冲洗缓冲区

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

  1. 检查输出socket是否准备好,否则返回
  2. 刷新排队的消息

在您的代码中,因为您调用 bind 并立即发送,所以在调用时没有连接工作人员,因为他们根本没有足够的时间注意到。所以消息被排队,我们正在等待一些工人出现。现在有趣的部分 - 我们在哪里检查新工人?在发送功能本身!因此,除非我们稍后调用 send(),否则当实际上有一些工作人员连接时,我们的消息永远不会刷新,它们会永远排队。这就是 setInterval 起作用的原因,因为工作人员有足够的时间来注意和连接,并且您会定期检查是否有任何时间。

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

干杯;-)

于 2013-01-15T03:05:28.297 回答