2017-02-22 6 views
3

Ich verliere Nachrichten nur, wenn ich Themen abonnieren.ZeroMQ Pub/Sub löscht Nachrichten nur beim Abonnieren von Themen

Hier ist das Szenario:
Der Abonnent abonniert ein bestimmtes Thema und ruft dann den Herausgeber in einem anderen Thread (mit dem gleichen Kontext und dem gleichen "abonnierten Thema").
Der Verlag erhält das "abonnierte Thema" und veröffentlicht es.

Wenn ich zwei Prozeduren ausführen (dh 2 Abonnententhreads und 2 Publisher-Threads), erhalte ich nur eine Nachricht auf einem der Threads (nach dem Zufallsprinzip).
Ich habe keine Ahnung, warum ich die zweite Nachricht verliere.

Verlag thread:

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); 

Subscriber thread:

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); 

Ich betreibe den Teilnehmer Thread zweimal, und dies ist die Ausgabe:

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

Antwort

1

Sie erstellen zwei verschiedene Verlage das sind bind()-zu demselben inproc Endpunkt "# 1" - Ein Endpoint kann nur einmal gebunden werden, der zweite Publisher schlägt auf demselben Endpunkt auf bind() und sendet die Nachricht nicht.

Zusätzlich werden Sie wahrscheinlich wollen in einer gewissen Verzögerung zwischen dem Verleger bind() -ing hinzufügen und dann send() -Ing die erste Nachricht, aufgrund der slow joiner Problem - der Verleger könnte versuchen, zu senden und dann fallen, Ihre Nachricht bevor der Publisher und der Abonnent die Verbindung herstellen, wodurch Sie ebenfalls Ihre Nachricht verlieren.

+0

Interessant .. Obwohl es funktioniert, wenn ich keine Filter im Abonnement verwendet habe. Denkst du, dass es einen besseren Weg gibt als Pub/Sub? (weil ich etwas wie pub/sub aber viele zu viele brauche) – Drxxd

+0

Sie geben nicht genug Details, um wirklich zu verstehen, was der beste Weg ist, Ihre Kommunikation zu entwerfen. Sie können viele zu viele mit pub/sub tun, Sie müssen nur jedes Pub an seinen eigenen Endpunkt binden und dann jeden Teilnehmer mit jedem Pub verbinden. Aber warum brauchst du mehr als eine Pub-Steckdose? Ohne zu verstehen, was Sie vorhaben, kann ich nicht vorschlagen, was in Ihrem Fall am besten ist. – Jason

Verwandte Themen