ZeroMQ, Client-Server, bidirektionale Kommunikation möglich, nur wenn der Client mit dem Host verbunden ist?

8

Ich stehe vor dem folgenden Problem:

Ich habe einen Client (letztlich n-Clients) und möchte mich mit einem Server verbinden. Clients kennen die Server / Host-Adresse, aber der Server kennt die Adresse des Clients nicht. Ich möchte in der Lage sein, die folgenden Messaging-Muster zwischen Client-Server zu erreichen (sowohl der Client als auch der Server müssen in der Lage sein, die folgenden Nachrichtenmuster zu erreichen):

  • Nachrichten veröffentlichen (keine Antwort erwartet)
  • Nachrichten empfangen (keine Antwort erwartet)
  • Nachrichten anfordern / empfangen (Antwort erwartet)
  • Stream-Nachrichten (dies kann redundant sein, da es über das obige Veröffentlichungsnachrichtenmuster bedient werden kann)

Wieder der wichtige Punkt, und wo ich Schwierigkeiten habe, ist, wie man sich mit dem Host verbindet, während man immer noch Nachrichten senden und empfangen kann. Der Host kann keine Verbindung zu Clients herstellen, er kann nur Clientverbindungsanforderungen akzeptieren. Bitte beachten Sie, dass ich nicht nach einer Lösung mit Proxy / Broker suche, mit der sich Client und Server verbinden, ansonsten könnte ich direkt mit Lösungen wie rabbitmq gehen.

Wie kann ich das am besten erreichen, noch besser anhand von Code-Beispielen?

Vielen Dank.

    
Matt Wolf 08.06.2013, 12:09
quelle

1 Antwort

9

Für die Verbindung mit dem Server benötigen Sie auf der Clientseite ein Socket DEALER und auf dem Server ein Socket ROUTER . Da Sie ein Publish-Subskriptionsmuster benötigen, benötigen Sie auf der Clientseite ein Socket SUB und auf der Serverseite ein Socket PUB .

%Vor%

Sie binden also den Router und die Pub-Sockets und verbinden den Dealer und die Sub-Sockets. Als wenn du willst:

  • Nachrichten veröffentlichen (keine Antwort erwartet): Erstellen Sie einen Umschlag (Pub, Kanal, Nachricht) und senden Sie ihn über den Händler, auf der Router-Seite erhält der Router den folgenden Umschlag (Händler, Pub, Kanal, Nachricht ), so können Sie die Nachricht auf Kanal über PUB-Socket veröffentlichen.

  • Nachrichten empfangen (keine Antwort erwartet): Es wurde mit den SUB Sockets auf der Client-Seite gemacht, und da jede Veröffentlichung den ROUTER durchläuft, können Sie ganz einfach einen Abonnementmechanismus implementieren oder einfach ein SUB hinzufügen Socket auf der Serverseite und verbinden (inproc) mit dem PUB socket (vielleicht ist dies eine sauberere Lösung).

  • Nachrichten anfordern / empfangen (Antwort erwartet): Dies kann mit dem Dealer - Router geschehen. Sie erstellen einfach einen anderen Umschlag (req, message), so dass Ihr Router (erhalten: Händler, req, Nachricht) weiß, dass es verarbeitet werden sollte, und kann eine Antwort an den Händler senden. Wenn Ihr Server Anforderungen an die Clients senden muss, müssen Sie nur die verbundenen Clients im Auge behalten und einen Umschlag senden (Händler, Anforderung, Nachricht), damit Ihr Händler mit einem Beispiel (Umschlag, Nachricht) antworten kann / p>

  • Streaming: Wie Sie bereits sagten, kann dies mit dem Veröffentlichungsmuster

  • geschehen

So würde ich es machen, wenn Sie Herzklopfen brauchen, wird es ein bisschen kompliziert, aber nicht viel.

    
balazs 10.06.2013, 08:47
quelle