zmq - 何时使用 zmq_bind 或 zmq_connect

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。

问题> 我应该在什么情况下使用zmq_bind和何时使用zmq_connect?

http://api.zeromq.org/

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

你不是已经回答了自己的问题吗?我使用zmq_bind来监听套接字,使用zmq_connect连接到该套接字。 - Filip
例如,为什么我们必须将“接收器”设计为服务器?为什么不是客户端?为什么我们需要将“任务发送方”设计为客户端?为什么不是服务器? - q0987
任务工作者将结果推送到汇聚器。我猜它也可以像请求-响应那样工作。 - Filip
1个回答

25

有几个基本原则需要绑定和连接。一般来说,zeromq并不关心,只是你自己决定哪个更方便。

对于将互相通信的一对套接字,以下是几个问题,可以帮助你确定哪个应该绑定,哪个应该连接:

  1. 一个进程比另一个进程活得更长吗(即一个启动、做些事情、停止,而另一个则长时间运行)? 如果是这样,那么活得更长的那个应该绑定。
  2. 你是否有一侧或另一侧的多个实例? 如果是这样,没有多个实例(或具有较少实例的)的那个应该绑定,因为这样就要跟踪较少的URL。

这些大多是为了更容易地管理URL和连接。在vent/sink示例中,恰好有一个ventilator和一个sink,但可以有任意数量的workers(零到多个)。如果sink和vent都绑定,那么它们就不需要知道worker何时加入或退出。只需跟踪两个URL,而如果worker绑定,则必须为每个新的worker跟踪一个URL,并在每次有新的worker加入时告诉sink和/或vent新的URL。

*在某些边缘情况下,实际上会有所影响,但通常不会。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接