【问题标题】:ZeroMQ connect to physically non connected socketZeroMQ 连接到物理上未连接的套接字
【发布时间】:2021-12-06 01:02:25
【问题描述】:

我试图了解 ZeroMQ 是否可以将 pub 或 sub 套接字连接到不存在的(尚未)IP 地址。以后这个IP地址出现时会自动连接吗? 或者我应该在连接之前先检查存在吗? PUB 和 SUB 套接字的行为是否相同?

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: zeromq


【解决方案1】:

答案隐藏在手册中,here

对于大多数传输和套接字类型,连接不会立即执行,而是根据 ØMQ 的需要执行。因此,对 zmq_connect() 的成功调用并不意味着连接已经或可以实际建立。因此,对于大多数传输和套接字类型,绑定服务器套接字和连接客户端套接字的顺序无关紧要。 ZMQ_PAIR 套接字是一个例外,因为它们不会自动重新连接到端点。

正如那句话所说,绑定和连接的顺序无关紧要。这非常有用,因为您不必担心启动顺序;客户端会很高兴等待服务器上线,能够运行其他东西而不会阻塞连接。

其他有用的东西

绑定/连接的方向与上面使用的模式无关;因此PUB 套接字可以连接到已绑定到接口的SUB 套接字(反之可能感觉更自然)。

我认为很多人没有意识到的另一件事是,您可以多次绑定(或连接)套接字到不同的传输。因此,PUB 套接字可以非常愉快地发送到本地 in-process 线程的 SUB 客户端,同一台机器上的其他进程通过 ipc,并通过 tcp 发送到远程机器上的客户端。

您还可以做其他事情。如果您使用here 中的ZMQ_FD 选项,您可以通过某种方式获得ZMQ_EVENT 通知(我不记得细节),它会告诉您何时成功建立了基础连接。使用文件描述符可以将其包含在zmq_poll()(或其他一些反应器,如epoll()select())中。您还可以利用套接字可以具有的心跳功能,它会告诉您连接是否由于某种原因或其他原因(例如另一端的进程崩溃或网络电缆脱落)而死。使用像 zmq_poll()epoll()select() 这样的反应器意味着您可以拥有一个纯 Actor 模型事件驱动的系统,而无需定期检查状态标志等。

在 ZMQ 中使用这些工具可以创建非常健壮的分布式应用程序/系统,这些应用程序/系统知道自己的各个部分何时死亡、恢复活力、休假等。例如,只要知道一个链接失效可能意味着您的分布式应用程序中的一个节点会以某种方式改变其行为以适应这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多