2012-03-26 3 views
6

Ich habe eine kleine Gruppe von Peers (z.B. 10 Knoten), die bereits Nachrichten veröffentlichen und abonnieren. Das funktioniert gut. Der Cluster ist statisch und jeder Knoten kennt die Adresse der anderen Knoten.Was ist der beste Weg, um asynchrone No-Reply-Nachrichten zwischen Peers mit ØMQ zu senden?

In meinem Anwendungsfall brauche ich auch alle Knoten, um Nachrichten an einen bestimmten Knoten senden zu können, und alle Knoten sollten auf Nachrichten warten, die an sie adressiert sind. Der sendende Knoten benötigt keine Antwort, sollte nicht auf eine Antwort warten müssen und muss nicht wissen, dass der andere Knoten die Nachricht empfangen hat.

Welche Art von Muster und Socket-Typen könnte verwendet werden, um dies zu implementieren?

Ich bin ziemlich neu zu ØMQ, und habe die Freelance Pattern aus dem Leitfaden, genauer gesagt Model Three - Complex and nasty. Ist in meinem Fall der dort beschriebene ROUTER-ROUTER-Ansatz sinnvoll?

Ich denke daran, jeden Knoten an einen ROUTER-Socket binden zu lassen, indem man seiner Adresse eine Identität gibt (und sie in ihre Nachrichtenschleife "abfragt") und den Knoten auf einem ROUTER-Socket sendet, wobei er die Empfängerknotenadresse angibt als Identität.

Habe ich einen einfacheren Weg vermisst? Die Verwendung des obigen Ansatzes scheint vielleicht ein bisschen komplex zu sein, da ich die Handshake-Prozedur wirklich nicht brauche, die der empfangenden Seite die Fähigkeit gibt, eine Antwort zu senden.

Antwort

2

Um Arbeit an einen Peer zu senden, ohne eine Antwort zu benötigen, würde ich wahrscheinlich nur ein Fanout-Muster verwenden, mit dem Sie effektiver "feuern und vergessen" können.

Router und Händler sind wirklich für die "Gerät" Tier in einem "erweiterten" Anfrage/Antwort-Muster.

+0

Vielleicht verpasse ich hier etwas, aber wie kann ich mit Fan-Out eine Nachricht nur an einen bestimmten Knoten senden? – tle

+2

Sie hätten nur einen Knoten, der den PULL-Befehl ausführt, statt eine Reihe von Knoten. Mit anderen Worten, wenn Sie den Anwendungsfall "spezifischer Knoten" verwenden müssen, haben Sie ein einzelnes PUSH- und ein einzelnes PULL-Paar. Es gibt keine Erwartung, wenn Sie einen PUSH machen, dass Sie etwas im Gegenzug erhalten, also ist es in meinen Augen eine bessere asynchrone Metapher als REQ/REP. Sie könnten auch zu einem PUB/SUB zwischen einzelnen Knoten, wenn Sie nur das, was Sie bereits haben, architektonisch wiederverwenden möchten. – Shaun

+1

PUSH-PULL löscht Nachrichten nicht, wenn der Empfänger nicht erreichbar ist, wie in der Dokumentation, was bedeutet, dass wenn Ihr entfernter Knoten ausfällt (der Peer, an den Sie senden), er eine Menge alter Nachrichten erhält. Sie können dieses Problem natürlich abschwächen, indem Sie den Up-Down-Status des Empfängers (mittels Heartbeat oder Ähnlichem) verfolgen und den PUSh-Socket schließen, sobald der Knoten ausfällt (mit linger = 0 möglicherweise). –

Verwandte Themen