我们如何判断PUSH / PULL套接字是应该绑定()还是连接()?

时间:2016-12-09 09:03:15

标签: c# zeromq

在研究ZeroMQ时,PUSHPULL类型的套接字对我来说没有多大意义。据我所知,PUSH套接字应始终.connect(),因为它只发送,PULL套接字应该.bind(),因为它只接收数据。

通常的例子显示如下:

PUSH-PULL example 以下是通常的设置方式:

  • 节点A有 PUSH 套接字,绑定(为什么?)
  • 节点C有 PULL 套接字且绑定
  • 中间节点有 PULL PUSH 套接字,但.bind()没有, .connect()两者。

如何我们决定PUSH / PULL套接字应 .bind() 还是 .connect() -ed?

2 个答案:

答案 0 :(得分:1)

通常,系统中更稳定的部分(“服务器”)将绑定,并且更多瞬态部分(多个“客户端”)将连接。

大多数ZeroMQ套接字可以绑定(充当服务器)或连接(充当客户端)。您可以先连接并稍后绑定。客户端将继续尝试连接,直到服务器启动。这是ZeroMQ的一个非常好的功能。

如果是PUSH / PULL,它既可以绑定也可以连接。对于PUB / SUB,ROUTER / DEALER等也是如此。

在图中,您可以在运行时添加或删除中间节点,而无需重新配置或重新启动节点A或C.这可能是他们选择绑定A和C的原因。

答案 1 :(得分:0)

为什么? (。bind()而不是.connect())
因为只是 Node-A 没有任何知识,有多少 Node-B 工作人员类型 PULL - PUSH 数据处理器将在近期或远期出现/消失,它们知道各自的地址越少(因此它无法猜测何时/何地.connect()到,从它自己的一方)。

如何? (决定是否应该.bind()或.connect() - ed)
在静态确定性系统设计中,人们可以自由选择。 ZeroMQ框架完成剩下的工作。聪明,不是吗?

在动态非确定性系统设计中,在这些节点上 .bind() ,必须保证“可见性”(地址,连通性),其余的凡人应该 { {1}} 对于那些在严酷现实的激烈风暴中仍然可见的“灯塔”:o)