18

参考http://hintjens.wdfiles.com/local--files/main:files/cc1pe.pdf 第22页分而治之

                    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");
    

我对何时使用 zmq_bind 或 zmq_connect 感到困惑。它说大多数时候“服务器”使用 zmq_bind 而“客户端”使用 zmq_connect。

Question> 什么时候应该使用zmq_bind,什么时候应该使用zmq_connect?

http://api.zeromq.org/

zmq_bind - accept incoming connections on a socket  
zmq_connect - create outgoing connection from socket
4

1 回答 1

23

有一些基本原则可以绑定和连接。一般来说,zeromq 并不关心*,它只是取决于你什么更方便。

对于将相互通信的给定套接字对,这里有几个问题要问以确定哪个应该绑定和哪个应该连接:

  1. 其中一个进程是否比另一个进程寿命更长(即一个进程开始、做某事、停止,而另一个进程则坐下来运行很长时间)?如果是这样,寿命较长的应该绑定。
  2. 您是否有一侧或另一侧的多个实例?如果是这样,则不是多个(或具有较少实例)的那个应该绑定,因为要跟踪的 URL 更少。

这些主要是为了更容易管理 URL 和连接。在通风口/水槽示例中,只有一个呼吸机和一个水槽,但可以有任意数量的工作人员(零对多)。如果水槽和通风口都绑定,那么他们不需要知道工人来来去去。只有两个 URL 需要跟踪,而如果 worker 绑定,您必须跟踪每个新工作者的 URL,并在每次新工作者到达时告诉 sink 和/或发泄有关新 URL。

*它实际上在某些边缘情况下可能很重要,但通常不是。

于 2013-04-19T19:23:26.477 回答