ZeroMQ Pub / Sub仅在订阅主题时删除消息

时间:2017-02-22 18:12:28

标签: multithreading zeromq publish-subscribe

我只有在订阅主题时才会丢失消息。

以下是该情景:
订阅者订阅特定主题,然后在不同的线程中调用发布者(具有相同的上下文和相同的"订阅的主题")。 发布者收到"订阅的主题"并发布它。

当我运行两个程序(意味着2个订阅者线程和2个发布者线程)时,我在其中一个线程上(随机)只收到一条消息。
我不知道为什么我会丢失第二条消息。

发布商主题:

void *publisher = zmq_socket(ptStruct->zContext, ZMQ_PUB);
assert(0 == zmq_bind(publisher, "inproc://#1"));
printf("Publishes to %d \n", ptStruct->iID);
assert(-1 != zmq_send(publisher, &(ptStruct->iID), sizeof(ptStruct->iID), 0));
zmq_close(publisher);

订阅者帖子:

void *subscriber = zmq_socket(ptStruct->zContext, ZMQ_SUB);
assert(0 == zmq_connect(subscriber, "inproc://#1"));
assert(0 == zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, &(ptStruct->iID), sizeof(ptStruct->iID)));
printf("Subscribed to %d \n", ptStruct->iID);

/* Now run the publisher in a different thread */
OSTHREAD_CreateThread(&ptThread, publishThread, ptStruct, NULL);

assert(-1 != zmq_recv(subscriber, acRec, 255, 0));
printf("Got %d \n", acRec[0]);
zmq_close(subscriber);

我运行订阅者线程两次,这是输出:

Subscribed to 1
Subscribed to 2
Publishes to 1
Got 1
Publishes to 2

1 个答案:

答案 0 :(得分:1)

您正在创建两个不同的发布者bind() - 相同的inproc端点“#1” - 端点只能绑定一次,第二个发布者无法{{1} 1}}在同一端点上,然后不发送消息。

此外,由于slow joiner问题 - 发布商,您可能希望在发布商bind()之间添加一些延迟,然后bind() - 第一封邮件可以尝试在发布者和订阅者完成连接之前发送,然后删除您的消息,这也会导致您丢失消息。