RabbitMQ mit benutzerdefinierten Header zu speichern message-Parameter
Ich bin neu RabbitMQ, und ich bin etwas verloren in der Dokumentation.
Derzeit als ein Beispiel, den ich versuche zu bauen, ein kleines mailer-Dienst, der überwacht eine Warteschlange. Aber ich bin etwas stecken, wo sollte ich die Parameter, dass mein Dienst (Ziel, Thema, ...)
Sollte ich Sie in die codierte format (json), in meinem Nachrichten, oder sollte ich das header-Aufbau, wie im folgenden Beispiel:
string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message);
var properties = new BasicProperties();
properties.Headers = new Dictionary<string, object>();
properties.Headers.Add("destination", "matthias123@localhost");
channel.BasicPublish(exchange: "", routingKey: "sendmail", basicProperties: properties,body: body);
Beinhaltet die Verwendung der Header bieten zusätzlichen nutzen? Wie zum Beispiel wäre es möglich, filtern von Nachrichten, die gesendet werden, zu einem bestimmten Ziel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde es nicht verwenden-Header für das, was Sie zu tun versuchen. Diese Informationen gehören in den body der Nachricht, meiner Meinung nach.
Sieh es mal so:
Den Körper der Nachricht sollte enthalten alles, was Sie benötigen, um die Arbeit angefordert. In diesem Fall wäre es den Absender, den Betreff, die E-Mail-Inhalte, etc.
Header auf der anderen Seite, werden bits von Daten über die AMQP-Nachricht, nicht der Inhalt der Nachricht.
Es gibt eine Menge von möglichen Verwechslungen, die hier mit Ihrer Arbeit zu tun sein "E-Mail". Zu viel überschneidungen in der Terminologie zwischen den AMQP-Nachricht und E-Mail-Nachricht.
Dass gesagt wird, ich dir ein anderes Beispiel zu tun: die Berechnung der fibonacci-Folge.
In diesem Fall, die Nachricht, die Sie senden über rabbitmq enthalten würde, so etwas wie wie viele Orte des fibonacci zu berechnen vorne und dann, wie viele zurück zu senden, nach, dass.
Zum Beispiel könnten Sie senden eine Nachricht wie diese (als json in diesem Fall):
Sollte dies ein Ergebnis von
1, 1, 2
denn es beginnt bei der ersten position und gibt 3 Punkte aus der Sequenz.Mit Ihrer konkreten Fragestellung und Logik: sollte ich die
start
undtake
Attribute in den Header der Nachricht?Nicht.
Wenn ich das täte, würde das bedeuten, dass meine Nachricht leer ist, da alle Informationen über die Arbeit, die getan werden, enthalten in der Header.
Macht es keinen Sinn, wenn ich Blick auf es auf diese Weise, denn jetzt gibt es keine Nachricht senden... nur Kopfzeilen.
Auf der anderen Seite, wenn ich halten diese zwei Punkte von Daten in den Nachrichtentext, Header nützlicher ist, als ein Weg zum senden von Metadaten über die AMQP-Nachricht selbst... Keine Informationen über den Inhalt der Nachricht, sondern auch Informationen über die Idee, die Nachricht.
In diesem Fall sage ich, dass ich zurückkehren möchten Elemente aus der fibonacci-Folge. In anderen Worten, ich bin Eingriff in RPC (remote procedure call) und erwarte einen Wert zurück.
AMQP nicht unterstützt Rückgabewerte direkt. Was ich jedoch tun kann, ist das, was einen queue-Namen in den Kopfzeilen und senden das Ergebnis an die Warteschlange. Dann den code, der angefordert die fibonacci-zahlen hören können, dass die Warteschlange und bekommen die Ergebnisse.
So, ich könnte etwas tun, wie dies beim senden der Nachricht:
Hier bin ich die Einrichtung eines "return-queue" - header - Informationen über die Nachricht, oder Anfrage für Informationen in diesem Fall - innerhalb der Header. Der code, der verarbeitet die fibonacci-Folge liest diesen header aus und senden die Antwort zurück an diese Warteschlange.
Dies ist eine bessere Nutzung der Header, da macht es die header speichern von Informationen über die Nachricht... In diesem Fall, wo die Antwort gesendet werden soll. Die Kopfzeilen enthalten nicht Informationen über die tatsächliche Arbeit geleistet werden, obwohl. Das ist alles gespeichert, die im Nachrichtentext direkt.
P. S. ich bin absichtlich nicht die "reply-to" - Eigenschaft, wie Sie normalerweise sollte, zu tun RCP. Ich bin mit diesem als Beispiel dafür, warum sollten Sie nicht setzen Sie Ihr "Ziel" in den Kopf. Für eine bessere Implementierung der fibonacci-Folge-Idee, finden Sie in der RMQ-docs und wie es verwendet wird "reply-to" richtig https://www.rabbitmq.com/tutorials/tutorial-six-dotnet.html