我正在使用PUB
/SUB
设计,我的问题是:
我.bind()
可以在另一个套接字对它进行 -ed 之后访问一个端口.connect()
,还是应该.bind()
在另一个套接字尝试访问.connect()
同一个地址之前访问它?
换句话说:
.bind()
和的顺序.connect()
重要吗?
(我认为这个问题不是特定于PUB
/SUB
但与任何设计相关)。
ZMQ 背后的一个驱动原则是不用担心您尝试连接的套接字是否已经存在。这些是 ZMQ 试图从开发人员那里抽象出来的细节。所以,不,任何套接字类型的顺序bind()
都connect()
无关紧要。
如果您打算使用它进行大量工作,我建议您阅读zmq 指南,相关部分在这里:
请记住,ZeroMQ 执行异步 I/O,即在后台执行。假设您有两个节点按以下顺序执行此操作:
- 订阅者连接到端点并接收和计算消息。
- Publisher 绑定到一个端点并立即发送 1,000 条消息。
那么订阅者很可能不会收到任何东西。你会眨眼,检查你是否设置了正确的过滤器,然后再试一次,订阅者仍然不会收到任何东西。
...这里有一点需要注意,对于 PUB/SUB - 即使您connect()
首先与订阅者联系,该连接实际上直到发布者-ed之后bind()
才会发生,因此如果您尝试在没有的情况下与发布者发送消息等待您的订阅者完成连接,这些消息将永远不会发送给您的订阅者。
它取决于单播传输,tcp://
并且ipc://
传输类是断开连接的,因此顺序.bind()
无关紧要.connect()
。
但是inproc://
传输类是连接的,因此需要.bind()
先连接,然后再连接.connect()
。