2013-04-19 5 views
10
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 
+0

Вы уже не ответили на свой вопрос? Я использую zmq_bind для прослушивания сокета и zmq_connect для подключения к этому сокету. – Filip

+0

Например, почему мы должны проектировать раковину в качестве сервера? почему не клиент? Почему нам нужно создать диспетчер задач как клиента? почему не сервер? – q0987

+0

вам НЕ НУЖНО - вот только пример. Работодатель подталкивает результаты к раковине. Я думаю, он мог бы работать как запрос - ответ. – Filip

ответ

10

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

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

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

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

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

Смежные вопросы