使用RabbitMq,可以通过Channels在单个连接上实现对多个队列的订阅。这允许使用单个套接字来处理多个订阅。在Zero MQ中最小化多个消息类型的套接字连接的模拟策略是什么?
答案 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个选项来处理多个主题:
从信封中读取消息类型,根据消息类型使用解串器(图中的客户端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