verlorene Nachrichten auf zeromq pub sub
Ich versuche zu implementieren, das pub-sub-design pattern mit zeromq Rahmen.
Die Idee ist, starten Sie eine Abonnenten-und danach starten die publisher.
Die Teilnehmer hören zu 100 Nachrichten und die publisher veröffentlichen wird 100 Nachrichten.
So weit So gut...
Aber was tatsächlich passiert, ist, dass auch, dass der Abonnent bereits laufen, wenn der publisher ist gestartet , nicht alle Nachrichten empfangen werden, durch den Teilnehmer (100 Nachrichten abgeholt werden, die von den Abonnenten, wenn die publisher senden mindestens 500 Mitteilung). Es scheint, dass die ersten Nachrichten von dem Verleger werden nicht an den Abonnenten gesendet.
Irgendwelche Ideen?
Vielen Dank im Voraus,
Omer.
Abonnenten-code (ins Leben gerufen, bevor der publisher)
int i=0;
zmq::context_t context (1);
zmq::socket_t subscriber (context, ZMQ_SUB);
subscriber.connect("tcp://localhost:5556");
subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0);
for (int update_nbr = 0; update_nbr < 100; update_nbr++)
{
zmq::message_t update;
subscriber.recv(&update);
i++;
std::cout<<"receiving :"<<i<<std::endl;
}
Publisher-code (gestartet, nachdem der Teilnehmer)
zmq::context_t context (1);
zmq::socket_t publisher (context, ZMQ_PUB);
publisher.bind("tcp://*:5556");
int i = 0;
for (int update_nbr = 0; update_nbr < 100; update_nbr++)
{
// Send message to all subscribers
zmq::message_t request (20);
time_t seconds;
seconds = time (NULL);
char update [20]="";
sprintf (update, "%ld", seconds);
memcpy ((void *) request.data (), update,strlen(update));
publisher.send(request);
i++;
std::cout << "sending :" << i << std::endl;
}
InformationsquelleAutor der Frage omer bach | 2011-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen http://zguide.zeromq.org/page:all#Missing-Message-Problem-Solver und suchen Sie nach "langsam Tischler" auf dieser Webseite.
Grundsätzlich braucht es ein wenig Zeit (ein paar Millisekunden) für die Verbindung eingestellt werden, und in dieser Zeit viele E-Mails verloren gehen können. Der Verleger muss ein wenig schlafen, bevor zu veröffentlichen, oder (besser) es muss explizit synchronisieren mit den Abonnenten.
InformationsquelleAutor der Antwort DNA
In 0MQ, erfolgreiche send() bedeutet nicht, dass Daten sofort gesendet über das Netzwerk. http://api.zeromq.org/2-1:zmq-send. Ihre Nachrichten sind ziemlich klein, und ANMUTIGEN 0MQ hat eine Art Pufferung für kleine Nachrichten, die das Netzwerk effektiver.
Wenn ich mich richtig erinnere ,
out_batch_size
imconfig.hpp
von 0MQ-Steuerelemente ein solches Verhalten.InformationsquelleAutor der Antwort istepura
Bitte schauen Sie das guide.
InformationsquelleAutor der Antwort dustc
Einer Sache zu sehen (über das hinaus, was frühere Kommentatoren haben darauf hingewiesen), wird die shutdown-Prozedur.
Den code-Schnipsel könnte einfach unvollständig, aber ich sehe nicht, wie Sie mit dem Herunterfahren. Insbesondere könnten Sie tatsächlich verlieren, die letzten Nachrichten, die gesendet werden. Werfen Sie einen Blick auf die Dokumentation für zmq_closezmq_term und ZMQ_LINGER. Wenn Sie nicht tatsächlich den Aufruf dieser Funktionen und werden stattdessen einfach beendet die Anwendung, dann gibt es eine chance, dass die Nachrichten, die gesendet wurden mit zmq_send() aber noch nicht übertragen worden, um das Netzwerk verloren beim Herunterfahren.
Zu überprüfen, welche Nachrichten verlorengegangen sind, könnten Sie versuchen, senden eine Sequenznummer neben dem Zeitstempel.
InformationsquelleAutor der Antwort robothor