Multithreading ZeroMQ发布/订阅仅在订阅主题时才会删除消息

Multithreading ZeroMQ发布/订阅仅在订阅主题时才会删除消息,multithreading,zeromq,publish-subscribe,Multithreading,Zeromq,Publish Subscribe,我只有在订阅主题时才会丢失消息 以下是场景: 订阅者订阅特定主题,然后在不同的线程中调用发布者(使用相同的上下文和相同的“订阅主题”)。 发布者接收“订阅的主题”并发布它 当我运行两个过程(意味着2个订阅者线程和2个发布者线程)时,我只在其中一个线程上收到一条消息(随机)。 我不知道为什么我会丢失第二条信息 发布者线程: void *publisher = zmq_socket(ptStruct->zContext, ZMQ_PUB); assert(0 == zmq_bind(publi

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

以下是场景:
订阅者订阅特定主题,然后在不同的线程中调用发布者(使用相同的上下文和相同的“订阅主题”)。
发布者接收“订阅的主题”并发布它

当我运行两个过程(意味着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);
订阅线程:

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()
-ing和
send()
-ing第一条消息之间添加一些延迟,因为问题-发布者可能会在发布者和订阅者完成连接之前尝试发送消息,然后丢弃消息,这也会导致您丢失信息。

很有趣。。尽管在订阅中我没有使用任何过滤器时,它仍然有效。你认为有比酒吧/酒吧更好的方法吗?(因为我需要一些酒吧/酒吧之类的东西,但多对多)你没有给出足够的细节来真正理解设计沟通的最佳方式。您可以使用pub/sub进行多对多操作,只需将每个pub绑定到它自己的端点,然后将每个订阅者连接到每个pub。但是为什么你需要不止一个酒吧插座呢?如果不了解你想做什么,我就无法建议你的最佳方案。