2017-02-22 91 views
3

僅在訂閱主題時纔會丟失郵件。只有在訂閱主題時,ZeroMQ Pub/Sub纔會丟棄郵件

這裏是場景:
用戶訂閱特定的主題,然後在不同的線程(具有相同的上下文和相同的「訂閱的主題」)調用發佈者。
發佈者收到「訂閱的主題」併發布它。當我運行兩個過程(意味着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

你創建了兩個不同的出版商即bind() -ing到相同的inproc端點「#1」 - 端點只能綁定一次,第二個發佈服務器在相同端點上失敗bind(),然後不發送消息。

此外,你可能會想在發佈bind() -ing之間有一些延遲添加,然後send() -ing的第一條消息,由於slow joiner問題 - 發佈商可以嘗試發送,然後放下,你的消息在發佈者和訂閱者完成連接之前,這也會導致您丟失消息。

+0

有趣..雖然它在我沒有在訂閱中使用任何過濾器時起作用。你認爲有這樣一個比pub/sub更好的方法嗎? (因爲我需要pub/sub之類的東西,但是很多很多) – Drxxd

+0

你沒有給出足夠的細節來真正理解什麼是設計你的溝通的最佳方式。你可以用pub/sub做很多事情,你只需要將每個pub發送到自己的端點,然後將每個訂閱者連接到每個pub。但爲什麼你需要多個酒吧套接字?不明白你想要做什麼,我不能建議你的情況最好。 – Jason