2013-08-26 5 views
5

Ich versuche eine Pub/Sub-Architektur zu erstellen, in der mehrere Publisher und mehrere Abonnenten im selben Bus existieren. Nach dem, was ich im Internet gelesen habe, sollte immer nur ein Socket bind() aufrufen, und alle anderen (egal ob Pub oder Sub) sollten connect() aufrufen.Wie führe ich mehrere Verlage mit einem einzigen Endpunkt in ZeroMQ?

Das Problem ist, mit diesem Ansatz finde ich, dass nur der Herausgeber, der tatsächlich Bind() auf dem Socket überhaupt veröffentlicht Nachrichten veröffentlicht. Alle meine Publisher, die connect() aufrufen, scheinen im Hintergrund zu versagen und veröffentlichen keine Nachrichten auf dem Bus. Ich habe bestätigt, dass dies kein Problem mit dem Abonnentenschlüssel ist, da ich eine einfache "Sniffer" -App geschrieben habe, die alle Nachrichten auf dem Bus abonniert, und es zeigt nur den Herausgeber an, der bind() aufgerufen hat.

Wenn ich mehrere Bindungen mit dem Herausgeber versuche, tritt das "erwartete" zmq-Verhalten des unbemerkten Stehlens des Busses mit ipc auf, und ein Port in Verwendung wird mit tcp geworfen.

Ich habe dieses Verhalten mit IPC und TCP-Endpunkten verifiziert, aber letztendlich wird das gesamte System epgm verwenden. Ich nehme an (obwohl es natürlich falsch ist), dass ich in dieser Situation keinen Broker brauche, da keine dynamische Erkennung stattfindet (Endpunkte sind bekannt, ob ipc, tcp oder epgm Multicast).

Gibt es etwas, das ich vermisse, vielleicht eine Socket-Einstellung, die dazu führen würde, dass die verbindenden Publisher ihre Daten nicht wirklich senden? Laut der Literatur, die ich im Internet gesehen habe, mache ich Dinge "richtig", aber es funktioniert immer noch nicht.

Als Referenz mein Verleger Klasse hat die folgenden Methoden für den Endpunkt der Einrichtung:

ZmqPublisher::ZmqPublisher() 
: m_zmqContext(1), m_zmqSocket(m_zmqContext, ZMQ_PUB) 
{} 


void ZmqPublisher::bindEndpoint(std::string ep) 
{ 
    m_zmqSocket.bind(ep.c_str()); 
} 

void ZmqPublisher::connect(std::string ep) 
{ 
    m_zmqSocket.connect(ep.c_str()); 
} 

So letztlich meine Frage ist: Was ist der richtige Weg ist, mehrere Publisher auf dem gleichen Endpunkt zu handhaben, und Warum sehe ich keine Nachrichten von mehr als einem Publisher?

+0

Ihre Frage ist nicht klar; eine Überarbeitung in Erwägung ziehen. – raffian

Antwort

2

Es kann oder auch nicht relevant sein, aber The 0MQ Guide hat die folgende etwas rätselhafte Bemerkung:

In der Theorie mit omq Steckdosen, es spielt keine Rolle, welches Ende verbindet und welches Ende bindet. In der Praxis gibt es jedoch undokumentierte Unterschiede, auf die ich später zurückkommen werde. Für den Moment binden Sie den PUB und verbinden Sie den SUB, außer Ihr Netzwerk-Design macht das unmöglich.

Ich habe noch nicht entdeckt, wo die „gekommen, um später“ tatsächlich passiert, aber ich pub/sub nicht so verwenden viel, und haben nicht die „Advanced Pub-Sub Patterns“ Teil des Handbuchs in großartiges Detail.

Die Idee von mehreren Publishern auf einem einzigen Endpunkt, für mich, schlägt jedoch die Notwendigkeit für einen XPUB/XSUB Stil Broker; Es geht nicht um dynamische Entdeckung, es geht um einen einzelnen Kontaktpunkt und Routing. Letztendlich würde ich denken, dass eine maklerbasierte Topologie Ihre Anwendung vereinfachen und die Problemerkennung erleichtern würde.