[PYTHON] RabbitMQ Tutorial 5 (Thema)

Rabbit MQ Tutorial 5 https://www.rabbitmq.com/tutorials/tutorial-five-python.html Es ist eine Übersetzung von. Wir freuen uns darauf, auf Übersetzungsfehler hinzuweisen.

Voraussetzungen

In diesem Lernprogramm wird davon ausgegangen, dass RabbitMQ auf dem Standardport (5672) auf dem lokalen Host installiert ist und ausgeführt wird. Wenn Sie einen anderen Host, Port oder Anmeldeinformationen verwenden möchten, müssen Sie Ihre Verbindungseinstellungen anpassen.

Wenn ein Problem auftritt

Wenn Sie in diesem Tutorial auf Probleme stoßen, können Sie uns über die Mailingliste kontaktieren.

Thema

(Verwenden des Python-Clients pika 0.9.8)

Im vorherigen Tutorial haben wir das Protokollierungssystem verbessert. Anstelle eines Fan-Out-Austauschs, der nur einen Dummy senden kann, ist es jetzt möglich, einen direkten Austausch zu verwenden und Protokolle selektiv zu empfangen.

Wir haben das System durch direkten Austausch verbessert, aber es gibt immer noch Einschränkungen. Der direkte Austausch erlaubt kein Routing basierend auf mehreren Kriterien.

In unserem Protokollierungssystem möchten wir nicht nur nach Schweregrad abonnieren, sondern auch nach der Quelle, die das Protokoll veröffentlicht. Möglicherweise kennen Sie dieses Konzept mit dem Syslog-Tool von Unix. Es protokolliert basierend auf dem Schweregrad (Informationen / Warnung / Kritisch ...) und der Einrichtung (Auth / Cron / Kern ...). Route

Dieses Tool ist sehr flexibel. Möglicherweise möchten Sie alle Protokolle von "kern" abrufen, nicht nur die schwerwiegenden Fehler von "cron".

Um dies mit unserem Protokollierungssystem zu erreichen, müssen wir uns mit komplexeren Themenaustauschen vertraut machen.

Themenaustausch

An den Themenaustausch gesendete Nachrichten dürfen keinen routing_key haben, es muss sich um eine durch Punkte getrennte Liste von Wörtern handeln. Das Wort ist willkürlich, gibt jedoch normalerweise einige Merkmale an, die sich auf die Nachricht beziehen. Beispiele für Routing-Schlüssel: "stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit". Der Routing-Schlüssel kann eine beliebige Anzahl von Wörtern bis zu einer Grenze von 255 Byte enthalten.

Der Bindungsschlüssel muss dasselbe Format haben. Die Logik eines Themenaustauschs ähnelt der eines direkten Austauschs: Mit einem bestimmten Routing-Schlüssel gesendete Nachrichten werden zusammen mit einem passenden Bindungsschlüssel an alle Warteschlangen gesendet. Es gibt jedoch zwei wichtige Sonderfälle für das Binden von Schlüsseln:

\ * (Stern) kann nur ein Wort ersetzen. \ # (Hash) kann null oder mehr Wörter ersetzen.

Am einfachsten lässt sich das anhand eines Beispiels erklären:

(Zahl)

In diesem Beispiel senden wir eine Nachricht, die das Tier darstellt. Die Nachricht wird mit einem Routing-Schlüssel gesendet, der aus den folgenden drei Wörtern (und zwei Punkten) besteht: Das erste Wort des Routing-Schlüssels beschreibt "Beweglichkeit", das zweite Wort beschreibt "Farbe" und das dritte Wort beschreibt "Samen": "(Beweglichkeit). (Farbe). (Samen)"

Erstellen Sie drei Bindungen, "Q1" wird mit "\ *. Orange \ *" und "Q2" mit "\ *. \ *. Rabbit" und "faul. #" Kombiniert.

Diese Bindungen können wie folgt zusammengefasst werden:

"Q1" interessiert sich für alle orangefarbenen Tiere. "Q2" will alles über Kaninchen und alles über faule Tiere hören.

Nachrichten mit dem Routing-Schlüssel "quick.orange.rabbit" werden an beide Warteschlangen gesendet. Die Nachricht "lazy.orange.elephant" geht auch an beide. Andererseits geht "quick.orange.fox" nur in die erste Warteschlange und "lazy.brown.fox" nur in die zweite. "lazy.pink.rabbit" stimmt mit den beiden Bindungen in der zweiten Warteschlange überein, wird jedoch nur einmal an die zweite Warteschlange übergeben. "quick.brown.fox" stimmt mit keiner Bindung überein und wird verworfen.

Was ist, wenn Sie Ihr Versprechen brechen und eine Nachricht mit einem oder vier Wörtern senden, z. B. "orange" oder "quick.orange.male.rabbit"? Diese Nachrichten gehen verloren, weil sie keiner Bindung entsprechen.

Andererseits hat "lazy.orange.male.rabbit" vier Wörter, stimmt jedoch mit der letzten Bindung überein und wird an die zweite Warteschlange übergeben.

Themenaustausch

Der Austausch von Themen ist leistungsstark und kann sich wie jeder andere Austausch verhalten.

Die Warteschlange ist der Bindungsschlüssel "#In Kombination mit (Hash) erhalten Sie alle Nachrichten, unabhängig vom Routing-Schlüssel, wie bei einem Fanout-Austausch.

Sonderzeichen"*"(Star),"#Wenn "(Hash) nicht in der Bindung verwendet wird, verhält sich der Themenaustausch wie ein direkter Austausch.

Alle Zusammenfassung

Das Protokollierungssystem verwendet den Themenaustausch. Nehmen wir an, dass der Protokollroutingschlüssel zwei Wörter enthält: "(Einrichtung). (Schweregrad)".

Der Code ist fast der gleiche wie im vorherigen Tutorial.

Code von emit_log_topic.py

 1    #!/usr/bin/env python
 2    import pika
 3    import sys
 4
 5    connection = pika.BlockingConnection(pika.ConnectionParameters(
 6            host='localhost'))
 7    channel = connection.channel()
 8
 9    channel.exchange_declare(exchange='topic_logs',
10                             type='topic')
11
12    routing_key = sys.argv[1] if len(sys.argv) > 1 else 'anonymous.info'
13    message = ' '.join(sys.argv[2:]) or 'Hello World!'
14    channel.basic_publish(exchange='topic_logs',
15                          routing_key=routing_key,
16                          body=message)
17    print " [x] Sent %r:%r" % (routing_key, message)
18    connection.close()

Code für receive_logs_topic.py:

 1    #!/usr/bin/env python
 2    import pika
 3    import sys
 4
 5    connection = pika.BlockingConnection(pika.ConnectionParameters(
 6            host='localhost'))
 7    channel = connection.channel()
 8
 9    channel.exchange_declare(exchange='topic_logs',
10                             type='topic')
11
12    result = channel.queue_declare(exclusive=True)
13    queue_name = result.method.queue
14
15    binding_keys = sys.argv[1:]
16    if not binding_keys:
17        print >> sys.stderr, "Usage: %s [binding_key]..." % (sys.argv[0],)
18        sys.exit(1)
19
20    for binding_key in binding_keys:
21        channel.queue_bind(exchange='topic_logs',
22                           queue=queue_name,
23                           routing_key=binding_key)
24
25    print ' [*] Waiting for logs. To exit press CTRL+C'
26
27    def callback(ch, method, properties, body):
28        print " [x] %r:%r" % (method.routing_key, body,)
29
30    channel.basic_consume(callback,
31                          queue=queue_name,
32                          no_ack=True)
33
34    channel.start_consuming()

So erhalten Sie alle Protokolle:

python receive_logs_topic.py "#"

So empfangen Sie alle Protokolle von der Einrichtung "kern":

python receive_logs_topic.py "kern.*"

Wenn Sie nur das "kritische" Protokoll hören möchten:

python receive_logs_topic.py "*.critical"

Sie können mehrere Bindungen generieren:

python receive_logs_topic.py "kern.*" "*.critical"

So veröffentlichen Sie ein Protokoll des Routing-Schlüssels "kern.critical":

python emit_log_topic.py "kern.critical" "A critical kernel error"

Spielen Sie mit diesem Programm. Beachten Sie, dass der Code keine Annahmen über das Weiterleiten oder Binden von Schlüsseln enthält. Er kann mit Parametern für mehr als einen Weiterleitungsschlüssel ausgeführt werden.

Einige Herausforderungen:

Fängt die Bindung "\ *" Nachrichten ab, die mit einem leeren Routing-Schlüssel gesendet wurden? Erfasst "#. \ *" Nachrichten, die mit der Zeichenfolge ".." verschlüsselt sind? Möchten Sie eine Schlüsselwortnachricht mit nur einem Wort erfassen? Was ist der Unterschied zwischen "a. \ *. #" Und "a. #"?

Fahren Sie mit Tutorial 6 fort, um mehr über RPC zu erfahren.

Recommended Posts

RabbitMQ Tutorial 5 (Thema)
RabbitMQ Tutorial 6 (RPC)
RabbitMQ Tutorial 4 (Routing)
RabbitMQ Tutorial 2 (Arbeitswarteschlange)
RabbitMQ Tutorial 3 (Veröffentlichen / Abonnieren)
RabbitMQ Tutorial 1 ("Hallo Welt!")
sqlalchemy Tutorial
PyODE Tutorial 2
Python-Tutorial
PyODE Tutorial 1
PyODE Tutorial 3
TensorFlow Tutorial Tutorial