PUB/SUB 我可以在 .bind() 之前先 .connect() 吗?

问题描述 投票:0回答:2

我正在使用

PUB
/
SUB
设计,我的问题是:

在另一个套接字已

.bind()
到某个端口后,我可以
.connect()
到某个端口吗? 或者我应该在另一个套接字尝试
.bind()
到同一地址之前
.connect()
吗?

换句话说:

.bind()
.connect()
的顺序重要吗?

(我认为这个问题不是特定于

PUB
/
SUB
,而是与任何设计相关)。

zeromq netmq nanomsg
2个回答
6
投票

ZMQ 背后的驱动原则是不担心您尝试连接的套接字是否已经存在。 这些是 ZMQ 试图从开发人员手中抽象出来的细节。 所以,不,

bind()
connect()
的顺序对于任何套接字类型都无关紧要。

如果您打算使用它进行大量工作,我建议您阅读zmq指南,相关部分在这里

请记住,ZeroMQ 执行异步 I/O,即在后台执行。假设您有两个节点按以下顺序执行此操作:

  • 订阅者连接到端点并接收和计数消息。
  • 发布者绑定到端点并立即发送 1,000 条消息。

那么订阅者很可能不会收到任何东西。您会眨眼,检查您是否设置了正确的过滤器,然后重试,订阅者仍然不会收到任何内容。

...这里有一个重要的点需要注意,对于 PUB/SUB - 即使您首先与订阅者

connect()
,该连接也不会实际上发生,直到发布者bind()编辑后,因此,如果您尝试在不等待订阅者完成连接的情况下向发布者发送消息,这些消息将永远不会发送给您的订阅者。
    


4
投票
tcp://

ipc://
传输类别是断开的,因此
.bind()
.connect()
的顺序并不重要。
但是

inproc://

传输级别已连接,因此需要先

.bind()
,然后
.connect()

https://zguide.zeromq.org/docs/chapter2/#Unicast-Transports

© www.soinside.com 2019 - 2024. All rights reserved.