【问题标题】:zeromq epgm pub/sub not workingzeromq epgm 发布/订阅不工作
【发布时间】:2013-03-13 04:14:57
【问题描述】:

我正在使用 node.js 示例。我已经在我的 ubuntu 12.10 机器上安装了 openpgm 和 zeromq 3.2。代码如下:

var zmq = require('zmq')
  , port = 'epgm://eth0;239.192.1.1:5555';

  var socket = zmq.socket('pub');

  socket.identity = 'publisher' + process.pid;

  var stocks = ['AAPL', 'GOOG', 'YHOO', 'MSFT', 'INTC'];

  socket.bind(port, function(err) {
    if (err) throw err;
    console.log('bound!');

    setInterval(function() {
      var symbol = stocks[Math.floor(Math.random()*stocks.length)]
        , value = Math.random()*1000;

      console.log(socket.identity + ': sent ' + symbol + ' ' + value);
      socket.send(symbol + ' ' + value);
    }, 1000);
  });

和其他应用程序:

var zmq = require('zmq') , port = 'epgm://eth0;239.192.1.1:5555';

var socket = zmq.socket('sub');

socket.identity = '订阅者' + process.pid;

socket.connect(端口);

socket.subscribe('AAPL'); socket.subscribe('GOOG');

console.log('已连接!');

socket.on('消息', 函数(数据) { console.log(socket.identity + ': 接收到的数据' + data.toString()); });

我不确定我是否使用了正确的多播寻址。我已经在同一台机器上尝试了这些应用程序,也在网络中的另一台机器上尝试过。我很确定我没有考虑过那部分,但我似乎无法在任何地方找到任何好的解释。但我希望这无论如何都能在同一台机器上工作。有什么想法吗?

PS:忘了解释到底发生了什么:基本上push程序只是推送所有消息而没有任何错误,而pull程序启动但没有收到任何消息。

【问题讨论】:

    标签: node.js zeromq multicast pgm-protocol


    【解决方案1】:

    不确定这是否有帮助,但我也一直在节点中试验 zmq 并进行了一些观察:

    我正在使用四台机器运行: 1:OS X 10.8.3 2:虚拟机中的 Ubuntu 12.10(桥接) 3:Ubuntu 12.04独立机
    4:Ubuntu 12.04分机

    当我在所有机器上启动相同的测试服务器时(与您上面的代码不太相似) 机器 1:查看机器 3 和 4 的更新 机器 2:查看来自 1、2、3 和 4 的更新 机器 3:查看来自 1、3、4 的更新 机器 4:查看来自 1、3、4 的更新

    所以看起来 OS X 会阻止对自己的广播。虚拟机中的 Ubuntu 12.10 正在获取每个人但发送问题(可能与在虚拟机中运行有关?)并且其他机器正在获取自己的。

    我的服务器/客户端:

    os = require 'os'
    zmq = require 'zmq'
    
    client = zmq.socket "sub"
    server = zmq.socket "pub"
    
    client.connect "epgm://224.0.0.1:5555", (error) ->
        if error?
            console.log "client error:", error
    
    client.subscribe ""
    client.on "message", (buffer) ->
        console.log "received ping:", buffer.toString!
    
    server.bind "epgm://224.0.0.1:5555", (error) ->
        if error?
            console.log "server error:", error
        setInterval ( -> 
            server.send "#{os.hostname!}" 
        ), 1000
    
    process.on "SIGINIT", ->
        client.close!
        server.close!
        process.exit!
    

    【讨论】:

    • 所以基本上,OSX 机器正在阻止广播。我什至没有在虚拟机中运行 ubuntu。这是一个基本操作系统,我仍然看不到我自己的更新。但我会试试你的代码(尤其是你选择的广播地址)并试一试
    • 实际上正在进一步调查中... OS X 工作正常... 它使用的 libzmq 版本比 ubuntu 更新,他们阻止了多播的环回,因为它有问题。所以 OS X 机器正在获取其他人的广播,但它自己的。播的不错似乎有问题的是12.10。 12.04 机器也可以正常工作,因为它们使用的是 zmq 的 v2 而不是 v3。
    【解决方案2】:

    epgm 和 pgm 仅适用于 PUB/SUB。

    【讨论】:

    • @Wildfire 哦。我没有意识到我的标题是推/拉。对不起!
    • ...并且仅在不同的机器上。 3.0 NEWS:MQ_MCAST_LOOP removed. There's no support for multicast over loopback any more. Use IPC or TCP isntead.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多