Zmq - когда использовать zmq_bind или zmq_connect

Refer to http://hintjens.wdfiles.com/local--files/main:files/cc1pe.pdf
Page 22 Chapter Divide and Conquer

                    Ventilator[PUSH]
        ___________________|____________________             
        |                  |                   |
[PULL]Worker[PUSH] [PULL]Worker[PUSH]  [PULL]Worker[PUSH]
        |__________________|___________________|             
                           |                   
                     [PULL]Sink

// taskvent.c
    //  Socket to send messages on
    void *context = zmq_ctx_new ();
    void *sender = zmq_socket (context, ZMQ_PUSH);
    zmq_bind (sender, "tcp://*:5557");

    //  Socket to send start of batch message on
    void *sink = zmq_socket (context, ZMQ_PUSH);
    zmq_connect (sink, "tcp://localhost:5558");

// taskwork.c
    //  Socket to receive messages on
    void *context = zmq_ctx_new ();
    void *receiver = zmq_socket (context, ZMQ_PULL);
    zmq_connect (receiver, "tcp://localhost:5557");

    //  Socket to send messages to
    void *sender = zmq_socket (context, ZMQ_PUSH);
    zmq_connect (sender, "tcp://localhost:5558");

// tasksink.c
    //  Prepare our context and socket
    void *context = zmq_ctx_new ();
    void *receiver = zmq_socket (context, ZMQ_PULL);
    zmq_bind (receiver, "tcp://*:5558");

I feel confused when to use zmq_bind or zmq_connect.
It says that most of time "Server" uses zmq_bind and "Client" uses zmq_connect.

Question> When I should use zmq_bind and when I should I use zmq_connect?

http://api.zeromq.org/
zmq_bind - accept incoming connections on a socket  
zmq_connect - create outgoing connection from socket

Ответ 1

Существует несколько основных принципов, для которых необходимо связывать и которые нужно подключать. В общем, zeromq не волнует *, это просто до вас, что более удобно.

Для данной пары сокетов, которые будут разговаривать друг с другом, вот несколько вопросов, которые нужно задать, чтобы определить, к какой привязке нужно подключиться:

  • Один из процессов живет дольше, чем другой (т.е. запускается, что-то делает, останавливается, а другой сидит и работает долгое время)? Если это так, то более продолжительный должен быть привязан.
  • Есть ли у вас несколько экземпляров одной или другой стороны? Если это так, то, который не является множественным (или тот, который имеет меньше экземпляров), должен связываться, потому что это меньше URL-адресов для отслеживания.

В основном это упрощает управление URL-адресами и соединениями. В примере с вентилятором/приемником имеется ровно один вентилятор и один приемник, но может быть любое количество рабочих (ноль-ко-многим). Если раковина и вентиляционное отверстие соединяются, то им не нужно знать о рабочих, когда они приходят и уходят. Есть только два URL-адреса, которые следует отслеживать, тогда как если бы работники привязались, вам приходилось отслеживать URL-адрес для каждого нового работника и сообщать приемнику и/или выпускать новый URL-адрес каждый раз, когда прибывает новый рабочий.

* это может иметь значение в некоторых случаях с краем, но не в целом.