2013-04-19 12 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

Nie jesteś już w stanie odpowiedzieć na swoje pytanie? Używam zmq_bind do słuchania na gnieździe i zmq_connect do podłączenia do tego gniazda. – Filip

+0

Na przykład, dlaczego musimy zaprojektować zlew jako serwer? dlaczego nie klient? Dlaczego musimy projektować zleceniodawcę-nadawcę jako klienta? dlaczego nie serwer? – q0987

+0

nie musisz - to tylko przykład. Taskworker przesyła wyniki do zlewu. To może działać jak żądanie - odpowiedź też, tak myślę. – Filip

Odpowiedz

10

Istnieje kilka podstawowych zasad, dla których należy powiązać i które połączyć. Generalnie zeromq nie obchodzi *, tylko od Ciebie zależy to, co jest wygodniejsze.

Dla danej pary gniazd, które będą mówić do siebie, oto kilka pytań zadać, aby dowiedzieć się, co powinno wiązać i które powinny łączyć:

  1. Czy jeden z procesów żyją dłużej niż drugi (tj. czy jeden start, coś zrobić, zatrzymać, podczas gdy drugi siada i biegnie długo)? Jeśli tak, to dłuższa osoba powinna się związać.
  2. Czy masz wiele instancji jednej strony lub drugiej? Jeśli tak, to ten, który nie jest wielokrotny (lub ten, który ma mniej instancji) powinien się połączyć, ponieważ jest to mniej adresów URL do śledzenia.

Dotyczy to głównie ułatwienia zarządzania adresami URL i połączeniami. W przykładzie ujścia/zlewu jest dokładnie jeden wentylator i jeden zlew, ale może być dowolna liczba pracowników (zero do wielu). Jeśli zlewozmywak i odpowietrznik obie się zwiążą, to nie muszą wiedzieć o pracownikach, kiedy przychodzą i odchodzą. Istnieją tylko dwa URL-e, które można śledzić, natomiast jeśli pracownicy są związani, trzeba będzie śledzić adres URL każdego nowego pracownika i poinformować o zlewu i/lub odpowiedzieć na nowy adres URL za każdym razem, gdy pojawi się nowy pracownik.

* w rzeczywistości może mieć znaczenie w niektórych przypadkach skrajnych, ale nie na ogół.