Может ли сокет ZeroMQ ROUTER сделать самопроизвольный асинхронный запрос к указанному сокету c DEALER? - PullRequest
0 голосов
/ 26 февраля 2020

Я читаю Руководство ZeroMQ и натолкнулся на следующий отрывок, касающийся сокета ROUTER и идентификаторов:

Приложение который использует сокет ROUTER для связи с указанными c узлами, которые могут преобразовать логический адрес в идентификатор, если он построил необходимую таблицу ha sh. Поскольку сокеты ROUTER сообщают только идентификатор соединения (указанному c узлу), когда этот узел отправляет сообщение, вы можете только реально ответить на сообщение, а не спонтанно общаться с узлом.

Это верно, даже если вы перевернете правила и заставите ROUTER подключиться к одноранговому узлу, а не ждать, пока одноранговый узел подключится к ROUTER , Однако вы можете заставить сокет ROUTER использовать логический адрес вместо его идентификатора. Справочная страница zmq_setsockopt вызывает эту настройку идентификатора сокета.

Согласно этому отрывку, "вы действительно можете только ответить на сообщение, а не спонтанно поговорить с партнером", то есть ROUTER не может отправить сообщение указанному c DEALER, но следующее предложение подразумевает, что вы можете, если вы заставите сокет маршрутизатора использовать логический адрес: «Однако вы можете заставить сокет ROUTER использовать логический адрес вместо его идентификатора» . Эта часть смущает меня, потому что они только что сказали, что вы не можете спонтанно отправлять сообщения от маршрутизатора дилеру, но теперь они утверждают, что вы можете. Если вы перейдете по этой ссылке на руководство, вы увидите, что после этого отрывка они говорят "Это работает следующим образом", но шаги, которые они дают, не проясняют, как отправлять спонтанные сообщения. сообщение от ROUTER указанному c DEALER и возврат ответа обратно к исходному ROUTER.

Мой вопрос: Возможно ли для одного ROUTER сокета отправить запрос на указанный c DEALER (из многих) сокет и DEALER отправить результат запроса обратно к ROUTER? И если это возможно, как это можно сделать?

Последующий вопрос: Если это невозможно, существует ли лучшая комбинация разъемов для этого?

Ниже приведена грубая схема моего предполагаемого дизайна:

enter image description here

По сути, клиент отправляет запрос на 1 спецификацию c сервер, этот сервер обрабатывает запрос и возвращает результат запроса клиенту. Теперь клиент имеет такой результат и знает, на каком сервере он был обработан.

1 Ответ

1 голос
/ 26 февраля 2020

Q : Возможно ли для одного сокета ROUTER отправить запрос на указанный c DEALER (из многих) сокет и DEALER отправить результат запроса обратно на ROUTER? И если это возможно, как это можно сделать?

Нет, насколько мне известно, это невозможно - он пытается использовать DEALER/ROUTER анти-шаблон.

Q : есть ли лучшая комбинация сокетов, чтобы приблизиться к этому?

Да, это может быть возможно в несколько диком виде подход к управляемым вручную идентификационным кадрам в ROUTER/ROUTER.


В случае, если никто никогда не работал с ZeroMQ,
здесь можно с первого взгляда посмотреть на "ZeroMQ Принципы менее чем за Пять секунд"
, прежде чем углубляться в дальнейшие детали


Хотя можно настроить 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. )
...