Inhaltsbasiertes Routing mit RabbitMQ und Python

7

Ist es mit RabbitMQ und Python möglich, inhaltsbasiertes Routing durchzuführen?

Der AMQP-Standard und RabbitMQ behaupten, das inhaltsbasierte Routing zu unterstützen, aber gibt es Bibliotheken für Python, die die Angabe von inhaltsbasierten Bindings usw. unterstützen?

Die Bibliothek, die ich gerade benutze (py-amqplib Ссылка ) scheint nur themenbasiertes Routing mit simple zu unterstützen Mustervergleich (#, *).

    
safl 19.07.2010, 11:37
quelle

2 Antworten

16

Die Antwort ist "Ja", aber es gibt noch mehr ...:)

Vereinbaren wir zuerst, was Content-basiertes Routing bedeutet. Es gibt zwei mögliche Bedeutungen. Einige Leute sagen, dass es auf dem Header Teil einer Nachricht basiert. Andere sagen, dass es auf dem Daten Teil einer Nachricht basiert.

Wenn wir die erste Definition nehmen, sind dies mehr oder weniger die Annahmen, die wir machen: Die Daten entstehen irgendwo und werden von einer Software an den AMQP-Broker gesendet. Wir gehen davon aus, dass diese Software genug über die Daten weiß, um Schlüssel / Wert-Paare (KV-Paare) in den Header der Nachricht einzufügen, die den Inhalt beschreiben. Im Idealfall ist der Absender auch der Produzent der Daten, also hat er so viele Informationen, wie wir uns nur wünschen können. Nehmen wir an, die Daten sind ein Bild. Wir könnten dann den Absender veranlassen, KV-Paare wie folgt in den Nachrichtenkopf zu schreiben:

%Vor%

Jetzt können wir das inhaltsbasierte Routing implementieren, indem wir entsprechende Warteschlangen erstellen. Nehmen wir an, wir haben eine separate Operation für Schwarz-Weiß-Bilder und eine separate für Farbbilder. Wir können zwei Warteschlangen erstellen, eine, die Nachrichten mit mode=bw und eine weitere mit mode=colour empfängt. Dann haben wir separate Clients, die diese Warteschlangen überwachen. Der Broker führt das Routing aus, und in unserem Client muss nichts über das Routing wissen.

Wenn wir die zweite Definition nehmen, gehen wir von verschiedenen Annahmen aus. Wir gehen davon aus, dass die Daten irgendwo entstehen und von einer Software an den AMQP-Broker gesendet werden. Aber wir nehmen an, dass es nicht sinnvoll ist zu fordern, dass diese Software den Header mit KV-Paaren füllen sollte. Stattdessen möchten wir eine Routing-Entscheidung basierend auf den Daten selbst treffen.

Dafür gibt es zwei Möglichkeiten in AMQP: Sie können entscheiden, einen neuen Austausch für Ihr spezielles Datenformat zu implementieren, oder Sie können das Routing an einen Client delegieren.

In RabbitMQ gibt es direkte (1-zu-1), Fan-Out (1-zu-N), Header (Header-gefiltert 1-zu-N) und Thema (Topic-gefilterte 1-zu-N) Austausch , aber Sie können Ihre eigenen nach dem AMQP-Standard implementieren. Dies würde erfordern viel RabbitMQ Dokumentation lesen und implementieren den Austausch in Erlang.

Die andere Option besteht darin, einen AMQP-Client in Python zu erstellen, der auf eine spezielle "Content-Routing-Queue" hört. Immer wenn eine Nachricht in der Warteschlange ankommt, nimmt Ihr Router-Client sie auf, tut alles, was benötigt wird, um eine Routing-Entscheidung zu treffen, und sendet die Nachricht zurück an den Broker zu einer geeigneten Warteschlange. Um also das obige Szenario zu implementieren, würde Ihr Python-Programm erkennen, ob ein Bild in Schwarz-Weiß oder Farbe ist, und würde es (wieder) an eine "Schwarz-Weiß" - oder eine "Farb" -Warteschlange senden, wo einige geeigneter Kunde würde übernehmen.

Also zu Ihrer zweiten Frage gibt es wirklich nichts, was Sie in Ihrem Client tun, das eine inhaltsbasierte Bindung durchführt. Entweder arbeiten Ihre Kunden wie oben beschrieben oder Sie erstellen einen neuen Austauschtyp in RabbitMQ. Dann definieren Sie in Ihrem Client-Setup-Code den Austauschtyp als Ihren neuen Typ.

Hoffe das beantwortet Ihre Frage!

    
Fabian Fagerholm 11.08.2010, 12:41
quelle
5

In RabbitMQ ist Routing der Prozess, bei dem ein Austausch entscheidet, in welche Warteschlangen Ihre Nachricht gestellt werden soll. Sie veröffentlichen alle Nachrichten an einer Vermittlungsstelle, Sie empfangen jedoch nur Nachrichten aus einer Warteschlange. Dies bedeutet, dass der Austausch ein aktiver Teil des Prozesses ist, der Entscheidungen über das Weiterleiten oder Kopieren von Nachrichten trifft.

Der in RabbitMQ enthaltene Themenaustausch betrachtet eine Zeichenfolge in den eingehenden Nachrichten (den Schlüssel routing_key) und gleicht diese mit den Mustern (den binding_keys) ab, die von allen Warteschlangen bereitgestellt werden, die ihren Wunsch mitteilen, Nachrichten von der Vermittlungsstelle zu empfangen.

Der RabbitMQ-Quellcode ist im Internet verfügbar. Hier können Sie sich den Thema Exchange-Code ansehen: Ссылка Ein Großteil der Komplexität besteht darin, eine Datenstruktur zu handhaben, die als Trie bezeichnet wird und sehr schnelle Suchvorgänge ermöglicht. In der Tat wird die gleiche Datenstruktur in Internet-Routern verwendet.

Hier finden Sie den Header-Header Ссылка ist wahrscheinlich einfacher zu verstehen. Wie Sie sehen können, ist nicht viel Code erforderlich, um eine andere Art von Exchange zu erstellen. Wenn Sie den Inhalt untersuchen möchten (oder vielleicht nur die ersten paar Bytes der Nachrichten ansehen), sollten Sie XML gegenüber JSON im Vergleich zu etwas anderem schnell identifizieren können. Und wenn Ihre JSON-Objekte und XML-Dokumente eine bestimmte Sequenz von Elementen beibehalten sollte in der Lage sein, zwischen verschiedenen JSON-Objekten (oder XML-Dokumenttypen) zu unterscheiden, ohne den gesamten Nachrichtentext zu analysieren.

    
Michael Dillon 01.06.2011 04:17
quelle

Tags und Links