node.js - nodeJS ZeroMQ : why cant send message if sock. 未在 setInterval 中发送

标签 node.js zeromq

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

最佳答案

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

  1. 将消息放入队列
  2. 刷新缓冲区

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

  1. 检查输出套接字是否就绪,否则返回
  2. 刷新排队的消息

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

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

干杯;-)

关于node.js - nodeJS ZeroMQ : why cant send message if sock. 未在 setInterval 中发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14138356/

相关文章:

用于基本信号的 ZeroMQ?

c++ - OpenCV 垫损坏

mysql - 不使用 Sequelize 方法的 Sequelize 查询中的分页

node.js - 从 ytdl-core express 下载的 360p 以上视频没有音频?

javascript - express js 不提供静态文件

linux - 自动重启 Node.Js 应用程序

python - 无法在 python 中导入 zmq(安装问题)

c++ - ZeroMQ 推/拉

sockets - Zeromq 哪个套接字应该绑定(bind)到 PubSub 模式

mysql - Sequelize 使用 MySQL 抛出断言错误