通过与0MQ的单个连接如何促进多种消息类型?

时间:2013-07-04 16:07:02

标签: zeromq

使用RabbitMq,可以通过Channels在单个连接上实现对多个队列的订阅。这允许使用单个套接字来处理多个订阅。在Zero MQ中最小化多个消息类型的套接字连接的模拟策略是什么?

1 个答案:

答案 0 :(得分:3)

我说PUB / SUB消息信封是在ZeroMQ中解决此问题的首选方法(参见Pub-Sub Message Envelopes)。

在发送消息之前,发布者应在信封中发送其主题:

    s_sendmore (publisher, "A");
    s_send (publisher, <Serialized MessageA>);
    .....
    s_sendmore (publisher, "B");
    s_send (publisher, <Serialized MessageB>);

Suscriber有3个选项来处理多个主题:

Figure 1

  • 从信封中读取消息类型,根据消息类型使用解串器(图中的客户端1)。

    char *topic = s_recv (subscriber);
    char *body = s_recv (subscriber);
    //If topic == "A", the body contains serialized MessageA, otherwise MessageB
    
  • 仅使用zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, ...);订阅一个主题。在这种情况下,ZeroMQ执行PUB端消息过滤(从3.x开始),客户端可以确保它只接收MessageA类型的消息(图中的客户端2)

    char *topic = s_recv (subscriber);
    char *body = s_recv (subscriber);
    //Ignore the topic, the body contains serialized MessageA
    
  • 订阅所有邮件并在客户端进程中创建一个代理,该代理在INPROC套接字上发布消息。个人订阅者应使用zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, ...);订阅单一类型的消息。 (见客户3)。

    void *frontend = zsocket_new (context, ZMQ_SUB);
    zsocket_connect (frontend, "tcp://<....>");
    void *backend = zsocket_new (context, ZMQ_PUB);
    zsocket_bind (backend, "inproc://all_messages");
    //  Start the proxy
    zmq_proxy (frontend, backend, NULL);
    ...
    //On another thread
    void *sub1 = zsocket_new (context, ZMQ_SUB);
    zsocket_connect (sub1, "inproc://all_messages");
    zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "A", 1);
    ...
    void *sub2 = zsocket_new (context, ZMQ_SUB);
    zsocket_connect (sub2, "inproc://all_messages");
    zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "B", 1);
    

您还可以找到有用的XPUB / XSUB套接字以用于各种技巧。例如,参见 Last Value Caching