首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只有在订阅主题时,ZeroMQ Pub/Sub才会删除消息

只有在订阅主题时,ZeroMQ Pub/Sub才会删除消息
EN

Stack Overflow用户
提问于 2017-02-22 18:12:27
回答 1查看 493关注 0票数 3

只有当我订阅主题时,我才会失去信息。

下面是一个场景:

订阅者订阅特定的主题,然后在不同线程中调用发布服务器(具有相同的上下文和相同的“订阅主题”)。

发布者接收“订阅的主题”并发布它。

当我运行两个过程(意味着两个订阅线程和两个发布者线程)时,我只在其中一个线程上接收到一条消息(随机)。

我不知道为什么我会失去第二条信息。

发布线程:

代码语言:javascript
运行
复制
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);

订阅线程:

代码语言:javascript
运行
复制
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);

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

代码语言:javascript
运行
复制
Subscribed to 1
Subscribed to 2
Publishes to 1
Got 1
Publishes to 2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-22 21:50:09

您正在创建两个不同的发布者,它们是bind()-ing到同一个inproc端点"#1“--一个端点只能绑定一次,第二个发布者在同一个端点上的bind()失败,然后不发送消息。

此外,您可能希望在publisher bind()-ing和send()-ing之间添加一些延迟,这是由于慢速接缝机问题--发布者可能会尝试在发布服务器和订阅服务器完成连接之前发送、然后删除您的消息,这也会导致您丢失消息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42399217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档