2013-04-19 16 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と接続を簡単に管理できるようにすることです。ベント/シンクの例では、ベンチレータとシンクが1つだけありますが、任意の数の作業者が存在します(0から多多)。流し台と通気口が両方とも縛られている場合、彼らは出入りする労働者を知る必要はありません。従業員が拘束されている場合は、新しい作業者ごとにURLを記録し、新しい作業者が到着するたびにシンクやベントに新しいURLを通知する必要があります。

*実際にはいくつかのエッジケースでは問題になる可能性がありますが、一般的ではありません。

関連する問題