ZMQ如何在两台不同的机器之间工作

时间:2015-05-07 19:28:17

标签: node.js sockets zeromq

我不确定我是否从根本上理解ZMQ(或任何消息队列)如何知道如何在两台服务器之间进行通信,否则彼此之间就不会知道任何事情。

例如,使用请求/回复模式:

请求者将绑定到主机和端口,如下所示:

var requester = zmq.socket("req");
 requester.bind('tcp://*:5555'), function (err) {
            callback(err);
        });

在另一台服务器上的另一个node.js进程中,我使用了connect函数:

 var replier = zmq.socket('rep');
    replier.connect('tcp://127.0.0.1:5555', function (err) {
       callback(err);
    });

但我不明白的是,如果回复者在一个完全不同的服务器上处于不同的进程中,请求者如何知道在何处发送消息?

2 个答案:

答案 0 :(得分:2)

您已经在评论中发现了一个问题 - connect()是同步的,并且您尝试异步使用它。

我建议,在node.js中,你同时bind()connect(),你可以通过异步运行这个一次性启动操作获得很少的好处,它只是使代码更清楚地同步做到这一点。如果你正在构建和拆除套接字中间进程,并且你真的有充分的理由这样做,那么你可以忽略这个建议,但是node给你很好的理由只做一次并在生命周期内使用相同的套接字这个过程。

至于两个不同的服务器如何找到对方,您的示例将失败:

// this tells the socket to listen to all incoming connections on post 5555
// but it does not create a connection to any other machine or process
requester.bindSync('tcp://*:5555');

......在另一台机器上......

// this tells the socket to connect to a bound socket on the same machine
// it will not find a socket on another machine
replier.connect('tcp://127.0.0.1:5555');

因此,您必须撤消bind()connect(),然后更改requester,如下所示:

// change 111.222.33.44 to the IP address or DNS name of your other machine
requester.connect('tcp://111.222.33.44:5555');

......在另一台机器上......

replier.bindSync('tcp://*:5555');

...或者,更改connect()调用以指定第一台计算机的IP地址,而不是环回地址。

以下是评估您应该connect()bind()的哪一方,因为我觉得其他建议不完整。

只要您{em>持续一侧(您的“服务器”)bind(),您connect()bind()的哪一方无关紧要和瞬态方面的connect()(您的“客户”)。如果它们同样具有持久性,则下一个选择的方法是{“1}}在”拥有“数据的一方,服务器的方式,以及{”1}}在“想要”数据的一方,客户的方式。

这就是为什么传统上你会bind() connect()套接字和bind() REP套接字,因为connect()套接字“想要”它正在请求的数据,REQ套接字“拥有”它发回的数据。同样,您REQ REP套接字,因为它“拥有”它发布的数据,并且您将bind() PUB套接字,因为它“想要”它订阅的数据。

这一切只是一个经验法则,connect()套接字完全可能比它的伴随SUB套接字更持久,或者SUB套接字“拥有”它发送到PUB套接字的数据。在许多情况下,无论如何,你可以选择任何一方都没有后果,但这些都是有用的规则,可以清楚地了解正在发生的事情。

答案 1 :(得分:1)

我认为你对请求者是哪个以及哪个是回复者感到困惑。或者更恰当的是哪一个是客户端,哪一个是服务器。

The Server是绑定又名socket.bind('tcp://*:5555')。这没有什么神奇之处。星号并不意味着在某些网络上多播或发现服务器。这意味着bind也可以监听机器的所有网络设备。

The client可能是您的错误名称reply.connect('tcp://127.0.0.1:5555 ...

客户端知道服务器在HTTP中的位置。 (提示它在同一台机器上:))。

ZeroMQ非常简单。它甚至不是一个真正的消息队列。它没有自动发现或中央代理,因此您必须自己保存服务器和客户端(例如Major Domo模式)。