multithreading - ZeroMQ Pub/Sub 仅在订阅主题时丢弃消息

标签 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

最佳答案

您正在创建两个不同的发布者,它们 bind()-ing 到相同的 inproc 端点“#1”——一个端点只能绑定(bind)一次,第二个发布者未能在同一个端点上 bind(),因此没有发送消息。

此外,您可能希望在发布者 bind()send() 之间添加一些延迟,因为slow joiner问题 - 发布者可能会在发布者和订阅者完成连接之前尝试发送然后丢弃您的消息,这也会导致您丢失消息。

关于multithreading - ZeroMQ Pub/Sub 仅在订阅主题时丢弃消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42399217/

相关文章:

谷歌云函数事件和上下文的 typescript 类型

node.js - 使用 redis pubsub 和 socket.io 的关注者状态更新通知

java - 并行for与Spring异步执行

多线程中的Python单元测试

zeromq - Majordomo 经纪人 : handling large number of connections

sockets - zeromq 如何与 SSL 协同工作?

java - Java中的多线程通信

java - 如何生成与从 JVisualVM 获得的线程转储类似的线程转储?

python - 如何在 ZMQ 中使用序列化发送图像和数据字符串?

Meteor.subscribe 被跳过,在 Tracker.autorun 中不起作用