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

Node.js ZMQ如何在两台不同的机器之间工作,node.js,sockets,zeromq,Node.js,Sockets,Zeromq,我不确定我从根本上理解了ZMQ(或任何消息队列)是如何知道如何在两台服务器之间进行通信的,否则这两台服务器就互不了解 例如,使用请求/应答模式: 请求者将绑定到主机和端口,如下所示: var requester = zmq.socket("req"); requester.bind('tcp://*:5555'), function (err) { callback(err); }); 在另一台服务器上的另一个node.js进程中,我使用了connec

我不确定我从根本上理解了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);
    });

但我不明白的是,如果回复者在一个完全不同的服务器上处于不同的进程中,那么请求者如何知道在哪里发送消息呢?几乎在任何地方都是如此。

我想你会对哪个是请求者,哪个是回复者感到困惑。或者更恰当地说,哪一个是客户端,哪一个是服务器

是绑定aka
socket.bind('tcp://*:5555')
。这没有什么神奇的。该星号并不意味着多播或发现某些网络上的服务器。这意味着在机器的所有网络设备上侦听

你的名字可能有误吗tcp://127.0.0.1:5555 …

客户端知道服务器在哪里,就像在HTTP中一样。(提示它在同一台机器上:))


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

我认为您会混淆哪个是请求者,哪个是回复者。或者更恰当地说,哪一个是客户端,哪一个是服务器

是绑定aka
socket.bind('tcp://*:5555')
。这没有什么神奇的。该星号并不意味着多播或发现某些网络上的服务器。这意味着在机器的所有网络设备上侦听

你的名字可能有误吗tcp://127.0.0.1:5555 …

客户端知道服务器在哪里,就像在HTTP中一样。(提示它在同一台机器上:))


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

您已经在注释中发现了一个问题-
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');
replier.bindSync('tcp://*:5555');
因此,您必须反转
bind()
connect()
,然后更改
请求者,如下所示:

// change 111.222.33.44 to the IP address or DNS name of your other machine
requester.connect('tcp://111.222.33.44: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');
replier.bindSync('tcp://*:5555');
。。。或者,更改
connect()
调用以指定第一台计算机的IP地址,而不是环回地址

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

只要您在持久端(您的“服务器”)上使用
bind()
connect()
,在临时端(您的“客户机”)上使用
bind()
,就可以了。如果它们同样是持久性的,那么下一种选择方法是在“拥有”数据的一侧使用服务器的方式进行
bind()
,在“想要”数据的一侧使用客户端的方式进行
connect()

这就是为什么传统上,您将
bind()
REP
socket和
connect()
REQsocket,因为
REQ
socket“需要”它所请求的数据,而
REP
socket“拥有”它发回的数据。类似地,您将
bind()
a
PUB
socket,因为它“拥有”正在发布的数据;您将
connect()
a
SUB
socket,因为它“想要”订阅的数据


这只是一条经验法则,一个
SUB
套接字完全可能比它的同伴
PUB
套接字更持久,或者一个
REQ
套接字“拥有”它发送到
REP
套接字的数据。在许多情况下,您可以选择任何一方,但这些都是有用的规则,您可以遵循这些规则来明确发生了什么。

您已经在注释中发现了一个问题-
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');
replier.bindSync('tcp://*:5555');
因此,您必须反转
bind()
connect()
,然后更改
请求者,如下所示:

// change 111.222.33.44 to the IP address or DNS name of your other machine
requester.connect('tcp://111.222.33.44: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');
replier.bindSync('tcp://*:5555');
。。。或者,更改
connect()
调用以指定第一台计算机的IP地址,而不是环回地址

下面是您应该选择哪一方的评估