“服务器”到“服务器”ZeroMQ通信

时间:2016-07-01 08:42:42

标签: c zeromq

我想构建一个具有以下架构的系统:

+------------------+          +------------------+
| App1. 0mq client | <------> | App2. 0mq server |
+------------------+          +------------------+

其中
App2 ZeroMQ服务器,它是一个黑盒子,
App1 ZeroMQ客户端,但它实际上是前端服务器。前端服务器将处理来自客户端的一些请求,然后将与 App2 服务器通信。

鉴于:

  1. 在任何时间点,任何“服务器”都可以关闭或重新启动。
  2. 我想启动任何应用,即使其他应用没有运行。
  3. 如果在 App2 关闭时启动 App1 ,我想知道 App2 何时启动。
  4. 是否可以实现3.仅使用ZeroMQ builtins ,或者我是否需要使用其他机制来通知 App1 App2 已经

2 个答案:

答案 0 :(得分:2)

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|!           |
|           !+------<BUF+           |         |         <BUF+------+!           |
|           !                       |         |                     !           |
|           ! ZMQ                   |         |   ZMQ               !           |
|           ! REQ-FSA               |         |   REP-FSA           !           |
~~~~~~~~~~~~~ DEADLOCKED in W2R ~~~~~~~~ * ~~~~~~ DEADLOCKED in W2R ~~~~~~~~~~~~~
|           ! /\/\/\/\/\/\/\/\/\/\/\|         |/\/\/\/\/\/\/\/\/\/\/!           |
|           ! \/\/\/\/\/\/\/\/\/\/\/|         |\/\/\/\/\/\/\/\/\/\/\!           |
+===========!=======================+         +=====================!===========+

Fig.2: 如何使用纯Item 3内置函数实现要求 ZeroMQ

App1.PULL.recv( ZMQ.NOBLOCK ) App1.PULL.poll( 0 ) 很明显

[App1]      ![ZeroMQ]
code-control! code-control           
+===========!=======================+
|           !                       |
|           !+----------+           |         
|     .poll()|   W2R ___|.bind()    |         
| ____.recv()<----o-|___|-(tcp:)--------O     
| PULL      !|      |___|           |   :   
|           !|      |___|           |   :   
|           !|      |___|           |   :   
|           !+------<BUF+           |   :     
|           !                       |   :                           ![App2]
|           !                       |   :     [ZeroMQ]              ! code-control
|           !                       |   :     [code-control         ! once gets started ...
|           !                       |   :     +=====================!===========+
|           !                       |   :     |                     !           |
|           !                       |   :     |         +----------+!           |
|           !                       |   :     |         |___       |!           |
|           !                       |   :     |         |___| <--o-<.send()____ |
|           !                       |   :<<-------<tcp:<|___|   W2S|!      PUSH |
|           !                       |   :    .connect() <BUF+------+!           |
|           !                       |   :     |                     !           |
|           !                       |   :     |                     !           |
+===========!=======================+   :     +=====================!===========+

答案 1 :(得分:1)

虽然我不是专家,但我曾经实施过类似的平台。

来自 REQ/REP App2的额外信号层( -> App1 可以做到这一点。

每次 App2 上线时, msg 应传达给 App1 。< / p>

App1 中的单独主题任何时候都可以从 msg 接收此App2