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

bạn không trả lời được câu hỏi của mình chưa? Tôi sử dụng zmq_bind để nghe trên socket và zmq_connect để kết nối với socket đó. – Filip

+0

Ví dụ, tại sao chúng ta phải thiết kế bồn rửa như một máy chủ? tại sao không phải là khách hàng? Tại sao chúng ta cần phải thiết kế nhiệm vụ-người gửi như một khách hàng? tại sao không phải là máy chủ? – q0987

+0

bạn KHÔNG CẦN - đó chỉ là ví dụ. Taskworker đẩy các kết quả vào bồn rửa chén. Nó có thể hoạt động giống như yêu cầu - trả lời quá, tôi đoán vậy. – Filip

Trả lời

10

Có một vài nguyên tắc cơ bản để liên kết và kết nối nào. Nói chung, zeromq không quan tâm *, nó chỉ phụ thuộc vào bạn những gì thuận tiện hơn.

Đối với một cặp nhất định socket mà sẽ nói chuyện với nhau, sau đây là một vài câu hỏi để hỏi để tìm ra nên ràng buộc và có nên kết nối:

  1. Liệu một trong những quá trình sống lâu hơn khác (tức là một người bắt đầu, làm điều gì đó, dừng lại, trong khi người kia ngồi và chạy một thời gian dài)? Nếu vậy, người sống lâu hơn nên ràng buộc.
  2. Bạn có nhiều phiên bản của một bên hay bên kia không? Nếu vậy, một trong đó không phải là nhiều (hoặc một trong đó có ít trường hợp) nên ràng buộc, bởi vì đó là ít URL để theo dõi.

Đây chủ yếu là giúp quản lý URL và kết nối dễ dàng hơn. Trong ví dụ lỗ thông hơi/chìm, có chính xác một máy thở và một bồn rửa, nhưng có thể có bất kỳ số lượng công nhân nào (từ 0 đến nhiều). Nếu bồn rửa và lỗ thông hơi bị trói buộc, thì họ không cần phải biết về công nhân khi họ đến và đi. Chỉ có hai URL để theo dõi, trong khi nếu các công nhân bị ràng buộc, bạn sẽ phải theo dõi URL cho mỗi nhân viên mới, và nói với bồn rửa và/hoặc lỗ thông hơi về URL mới mỗi khi một nhân viên mới đến.

* nó thực sự có thể quan trọng trong một số trường hợp cạnh, nhưng không phải là chung.

Các vấn đề liên quan