我正在构建一个新应用程序,该应用程序从多个外部设备接收数据,并需要将其提供给多个不同的组件。 ZeroMQ 似乎是专门为我的架构的“数据总线”方面构建的。
我最近意识到 zmq STREAM 套接字可以连接到本机 TCP 套接字并发送/接收消息。自始至终使用 zmq 有很大的吸引力,但我有一个问题不知道如何解决。
我的一台设备需要设置。也就是说,我将一个套接字连接到它,向它发送一些配置信息,然后等待它向我发送数据。该设备还具有“重置”功能(在某些情况下很有用),需要重新发送配置信息。执行此操作取决于对套接字接口的设置/拆卸阶段的可见性。我需要知道何时建立新连接,以便我可以发送必要的配置消息。
zmq 似乎是故意设计来让我不知道这些知识的。有办法做我想做的事吗?或者我应该为此接口使用常规套接字?
事实证明,阅读精美手册(正确版本)是有启发性的。
建立连接后,应用程序将收到一条零长度消息。同样,当对等方断开连接(或连接丢失)时,应用程序将收到一条零长度消息。
我想剩下的就是消除连接和断开之间的歧义。仍在寻求社区的建议,如果其他人以前处理过这种情况。
根据您自己的回答,我会犹豫是否要依赖零长度连接/断开消息作为您的整个策略 - 这似乎不必要地脆弱。 从你的问题中我不清楚哪一端是持久的,哪一端需要配置信息,但我希望一端知道它正在重置和重新连接,并且那一端需要来自对等方的配置信息,所以它应该询问 在需要时向其发送消息,对等方以请求的信息进行响应。
如果对等方在收到其他消息之前尚未获得所需的配置信息,它可以将该工作排队,或者可以响应配置需求,然后适当地获取所需的其余网络句柄.
您不需要流/tcp 套接字来实现该功能,它应该与更标准的 ZMQ 套接字类型一起使用,您只需要在应用程序中构建稳健性,而不是尝试从 TCP/套接字操作中免费获取它。
如果我没有理解你的观点,并且我的建议由于某种原因不起作用,你将必须提供有关你的网络拓扑的更具体的信息,以便其他人了解合适的解决方案可能是什么。
您可以使用套接字的监视功能并在建立/销毁连接时接收 CONNECTED - DISCONNECTED 事件。
例如在 JeroMQ 中:
socket.setEventHook({
println("event: $it")
}, ZMQ.EVENT_ALL)
这将打印所有这些不同的 ZEvents,例如:CONNECTED、DISCONNECTED、MONITOR_STOPPED、CONNECT_RETRIED 等等