【问题标题】:Can a ZeroMQ ROUTER socket make a spontaneous asynchronous request to a specific DEALER socket?ZeroMQ ROUTER 套接字可以向特定的 DEALER 套接字发出自发的异步请求吗?
【发布时间】:2020-02-25 22:14:23
【问题描述】:

我正在阅读 ZeroMQ Guide 并看到以下关于 ROUTER 套接字和身份的段落:

使用 ROUTER 套接字与特定对等方通信的应用程序可以 将逻辑地址转换为标识,如果它已经建立了必要的 哈希表。因为 ROUTER 套接字只宣布一个 连接(到特定的对等方) 当该对等方发送消息时,您 只能真正回复消息,不能自发与同伴交谈。

即使您翻转规则并使 ROUTER 连接到 而不是等待对等方连接到 ROUTER。 但是,您可以强制 ROUTER 套接字在 其身份的地方。 zmq_setsockopt 参考页面称此为 设置套接字标识。

根据这段话,“你只能真正回复消息,不能自发与同伴交谈”,意思是ROUTER不能发送向特定的DEALER 发送消息,但下一句暗示您可以强制路由器套接字使用逻辑地址:“但是您可以强制使用ROUTER 套接字一个逻辑地址代替其身份”。这部分让我感到困惑,因为他们刚刚说你不能自发地从路由器向经销商发送消息,但现在他们声称你可以。如果您按照this 链接到该指南,您会看到在这篇文章之后,他们说“它的工作原理如下”,但他们给出的步骤似乎并没有弄清楚如何从@ 发送自发消息987654335@ 到特定的DEALER 并将响应返回到原始ROUTER

我的问题:单个ROUTER 套接字是否可以向特定的DEALER(多个)套接字发送请求,而DEALER 发送请求的结果回到ROUTER?如果可能的话,如何做到这一点?

后续问题:如果这是不可能的,是否有更好的套接字组合来解决这个问题?

下面是我的预期设计的粗略图:

基本上,客户端向 1 个特定服务器发送请求,该服务器处理请求并将请求结果返回给客户端。客户端现在有了这个结果,它知道它是在哪个服务器上处理的。

【问题讨论】:

    标签: sockets zeromq distributed-computing distributed-system low-latency


    【解决方案1】:

    Q : 单个ROUTER 套接字是否可以向特定的DEALER(多个)套接字发送请求并且DEALER 发送结果请求回ROUTER?如果可能的话,如何做到这一点?

    不,据我所知这是不可能的 - 它尝试了 DEALER/ROUTER 反模式。

    有没有更好的套接字组合来解决这个问题?

    是的,这可以通过在ROUTER/ROUTER 中手动驱动的身份框架的有点疯狂的方法来实现。


    如果您从未使用过 ZeroMQ,
    您可以在这里先看看"ZeroMQ Principles in less than Five Seconds"
    在深入了解更多细节之前


    虽然可以使用身份技巧调整ROUTER 端,但您的问题在DEALER 端会失败,其中公平队列和循环策略会破坏您希望拥有的 1:1 关系并且 JobREQ:ResultREP 的配对将失败。


    更全面地了解这些玩具的内部工作原理:

    ZeroMQ 原型是智能的并且内部是多层的,超出了您在调用任何 API 方法时通常使用的功能。对(简化的,可能过于简化的)内部工作的一些见解可能会对此有所帮助:

                                                                              +------------------------------+  
                                                                              | Formal Behavioural Archetype |
                                                                              |                              |
                                                                              |                       ROUTER |
                                                                              +------------------------------+
                                                                              | BEHAVIOUR Management         |
              +------------------------------+                                |                              |
              | Formal Behavioural Archetype |                                |     HWM'd messages Dropped(*)| *unless ZMQ_ROUTER_MANDATORY set
              |                              |                                |                              |
              |                       DEALER |                                |                              |
              +------------------------------+                       <===.recv()   served in FAIR-QUEUED mode|
              | BEHAVIOUR Management         |                       .send()===>   served by identityFRAME id|
              | on                           |                                +------------------------------+ 
              | no peers                     |                                | IDENTITY Based Routing Policy| +may preset  ZMQ_CONNECT_ROUTING_ID for one next .connect() transport-setup call (ref. API for details)
              | or                           |                                |  <--prepend peer-Id on.recv()| +see setting ZMQ_ROUTING_ID and ZMQ_ROUTING_HANDOVER (ref. API for details)
              | all HWM'd in MUTE-STATE !Drop|                                |  -->remove  peer-Id on.send()|
     .send()===>   served in ROUND-ROBIN mode|                                |    +Drop if peer not visible | *unless ZMQ_ROUTER_MANDATORY set
     <===.recv()   served in FAIR-QUEUED mode|                                +------------------------------+
              +------------------------------+                                | QUEUE Management Department  |
              | QUEUE Management Department :|                                |                              |
              |                            ::|                                |                          |hwm|
              |                           :::|                                |   |                  |   |...|
              |hwm|              |   |   |hwm|                                |   |                  |   |.. |
              |...|              |hwm|   |...|                                |   |                  |hwm|.  |
              |.. |              |...|hwm|.. |                                |hwm|                  |...|   |
              |.  |              |.. |...|.  |                                +-:-|------------------|-:-|-:-|
              +-:-|--------------|-:-|-:-|:::+                                | TRANSPORT Handling Department|
              | TRANSPORT Handling Department|                                |---+                  +-------|
              |-------+          +-----------|                                |tcp|                  | ipc   |
              | inproc|          | ipc       |                                |-:-|                  |-:---:-|
              |-:-----|          |-:---:--:::|                                |.C |                  |.C |.C |
              |.C |   |          |.C |.C |.B |                                +-o-|------------------+-o---o-+
              +-o-|---+----------+-o---o---O-+                                  |                      |   |
                |                  |   |   ^                                    |                      |   |
                |                  |   |   |                                    |                      |   +----------------------.connect()->------- ... may be a { ROUTER | DEALER | REQ }-socket
                |                  |   |   |                                    +----------------------|--------------------------.connect()->------- ..
                |                  |   |   +-<--.connect()---[ROUTER].02----<--------------------------+
                |                  |   |   +-<--.connect()---[ROUTER].07--- .....
                |                  |   |   +-<--.connect()------[REP].41--- ....
                |                  |   +--------.connect()->----[REP].18--- ...
                |                  +------------.connect()->-[ROUTER].51--- ..
                +-------------------------------.connect()->----[REP].17--- .  (+ REP.send() message <=== sent must consist of an empty message part, the delimiter, followed by one or more body parts. )
    

    【讨论】:

    • 感谢您的详尽回复!我看过你很多其他涉及 ZeroMQ 的答案,你是一个了不起的资源。
    • 永远欢迎, @Vpaladino - 所有的功劳归于 Martin SUSTRIK - 父亲和 Pieter HINTJENS - 推动者和共同父亲 - 您将学到很多关于 Zen-of-Zero 来自这些大师
    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多