“服务器”到“服务器”ZeroMQ通信
我想构建一个具有以下架构的系统:
+------------------+ +------------------+ | App1. 0mq client | | App2. 0mq server | +------------------+ +------------------+
哪里
App2
是一个ZeroMQ
服务器,它是一个黑盒子,
和
App1
是一个ZeroMQ
客户端,但它实际上是一个前端服务器。 前端服务器将处理来自客户端的一些请求,然后将与App2服务器通信。
鉴于:
- 在任何时间点,任何“服务器”都可以关闭或重新启动。
- 我想启动任何应用程序,即使其他应用程序没有运行。
- 如果在App2关闭时启动App1 ,我想知道App2何时启动。
是否可以实现3.仅使用ZeroMQ
内置 ,或者我是否需要使用不同的机制来通知App1 App2已启动?
Item 3
:使用纯ZeroMQ
内置插件
Fig.1:
为什么使用天真的REQ/REP
是错误的
XTRN_RISK_OF_FSA_DEADLOCKED ~ { NETWORK_LoS : || NETWORK_LoM : || SIG_KILL( App2 ) : || ... : } : [App1] ![ZeroMQ] : [ZeroMQ] ![App2] code-control! code-control : [code-control ! code-control +===========!=======================+ : +=====================!===========+ | ! ZMQ | : | ZMQ ! | | ! REQ-FSA | : | REP-FSA! | | !+------+BUF> .connect()| v |.bind() +BUF>------+! | | !|W2S |___|>tcp:>---------[*]-----(tcp:)--|___|W2R |! | | .send()>-o--->|___| | | |___|-o---->.recv() | | ___/ !| ^ | |___| | | |___| ^ | |! \___ | | REQ !| | v |___| | | |___| | v |! REP | | \___.recv()<----o-|___| | | |___|<---o-<.send()___/ | | !| W2R|___| | | |___| W2S|! | | !+------
Fig.2:
如何使用纯ZeroMQ
内置实现需求Item 3
。
App1.PULL.recv( ZMQ.NOBLOCK )
和App1.PULL.poll( 0 )
很明显
[App1] ![ZeroMQ] code-control! code-control +===========!=======================+ | ! | | !+----------+ | | .poll()| W2R ___|.bind() | | ____.recv()<----o-|___|-(tcp:)--------O | PULL !| |___| | : | !| |___| | : | !| |___| | : | !+------
虽然我不是专家,但我曾经实施过类似的平台。
来自App2
->
App1
的附加信令层( REQ/REP
)可以做到这一点。
每次App2
线时,都应该将一个msg
传递给App1
。
App1
的单独线程可以随时从App2
接收此msg
。