[PYTHON] RabbitMQ Tutorial 4 (Routing)

Rabbit MQ Tutorial 4 https://www.rabbitmq.com/tutorials/tutorial-four-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.

Routing

(Verwenden des Python-Clients pika 0.9.8)

Im vorherigen Tutorial haben wir ein einfaches Protokollierungssystem erstellt. Ich konnte die Protokollnachricht an viele Empfänger senden.

In diesem Tutorial fügen wir Funktionen hinzu, mit denen Sie nur einen Teil der Nachricht abonnieren können. Beispielsweise können Sie nur schwerwiegende Fehlermeldungen in die Protokolldatei ausgeben (um Speicherplatz zu sparen) und weiterhin alle Meldungen an die Konsole ausgeben.

Bindung

Im vorherigen Beispiel haben Sie die Bindung bereits generiert. Sie werden sich an Code wie diesen erinnern:

channel.queue_bind(exchange=exchange_name,
                   queue=queue_name)

Bindungen sind die Beziehungen zwischen Austausch und Warteschlangen. Es kann gelesen werden, dass diese Warteschlange an der Nachricht von diesem Austausch interessiert ist.

Die Bindung kann einen zusätzlichen routing_key-Parameter annehmen. Um Verwechslungen mit den Parametern in basic_publish zu vermeiden, nennen wir es den Bindungsschlüssel. Bindungen mit Schlüsseln können wie folgt erzeugt werden:

channel.queue_bind(exchange=exchange_name,
                   queue=queue_name,
                   routing_key='black')

Die Bedeutung des Bindungsschlüssels hängt vom Austauschtyp ab. Zuvor verwendete Fanout-Börsen ignorierten diesen Wert einfach.

Direkter Austausch

Das Protokollierungssystem aus dem vorherigen Lernprogramm sendet alle Nachrichten an alle Verbraucher. Ich möchte dies erweitern, damit Nachrichten nach Schweregrad gefiltert werden können. Beispielsweise können Sie nur die schwerwiegenden Fehlerprotokollmeldungen, die Sie erhalten, auf die Festplatte schreiben, damit Sie keinen Speicherplatz mit Warnmeldungen oder Protokollmeldungen auf Informationsebene verschwenden.

Der Fanout-Austausch, den ich bisher verwendet habe, ist nicht sehr flexibel, er kann nur blind senden.

Verwenden Sie stattdessen den direkten Austausch. Der Direktaustausch-Routing-Algorithmus ist einfach. Die Nachricht wird in eine Warteschlange mit einem Bindungsschlüssel gestellt, der genau mit dem Routing-Schlüssel übereinstimmt.

Berücksichtigen Sie zur Erläuterung die folgenden Einstellungen:

(Zahl)

In dieser Einstellung gibt es einen direkten Austausch "X" und zwei damit verbundene Warteschlangen. Die erste Warteschlange hat zwei Bindungen mit dem Bindungsschlüssel "orange" und die zweite Warteschlange hat zwei Bindungen, eine mit dem Bindungsschlüssel "schwarz" und die andere mit dem Bindungsschlüssel "grün". ..

Mit einer solchen Einstellung wird das Veröffentlichen für den Nachrichtenaustausch mit dem Routing-Schlüssel "orange" an die Warteschlange "Q1" weitergeleitet. Nachrichten mit einem Routing-Schlüssel von "schwarz" oder "grün" gehen zu "Q2". Alle anderen Nachrichten werden verworfen.

Mehrfachbindungen

Es ist vollkommen in Ordnung, mehrere Warteschlangen mit demselben Bindungsschlüssel zu kombinieren. In diesem Beispiel können Sie eine "schwarze" Tastenverbindung zwischen "X" und "Q1" hinzufügen. In diesem Fall verhält sich der direkte Austausch wie ein Fanout und sendet die Nachricht an alle übereinstimmenden Warteschlangen. Nachrichten mit dem Routing-Schlüssel "schwarz" werden sowohl an "Q1" als auch an "Q2" gesendet.

Protokolle ausstellen

Verwenden Sie dieses Modell für Ihr Protokollierungssystem. Senden Sie eine Nachricht an Direct Exchange, anstatt sie zu fächern. Gibt den Schweregrad des Protokolls als Routing-Schlüssel an. Auf diese Weise kann das empfangende Skript den Schweregrad auswählen, den es empfangen möchte. Konzentrieren wir uns zunächst auf das Veröffentlichen von Protokollen.

Wie immer müssen Sie zuerst den Austausch generieren:

channel.exchange_declare(exchange='direct_logs',
                         type='direct')

Und Sie können eine Nachricht senden:

channel.basic_publish(exchange='direct_logs',
                      routing_key=severity,
                      body=message)

Der Einfachheit halber ist der Schweregrad entweder "Info", "Warnung" oder "Fehler".

Abonnieren

Das Empfangen einer Nachricht funktioniert mit einer Ausnahme genauso wie im vorherigen Lernprogramm, wobei für jeden interessierenden Schweregrad eine neue Bindung generiert wird.

result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue

for severity in severities:
    channel.queue_bind(exchange='direct_logs',
                       queue=queue_name,
                       routing_key=severity)

Alle Zusammenfassung

Code von emit_log_direct.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='direct_logs',
10                             type='direct')
11
12    severity = sys.argv[1] if len(sys.argv) > 1 else 'info'
13    message = ' '.join(sys.argv[2:]) or 'Hello World!'
14    channel.basic_publish(exchange='direct_logs',
15                          routing_key=severity,
16                          body=message)
17    print " [x] Sent %r:%r" % (severity, message)
18    connection.close()

Code für receive_logs_direct.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='direct_logs',
10                             type='direct')
11
12    result = channel.queue_declare(exclusive=True)
13    queue_name = result.method.queue
14
15    severities = sys.argv[1:]
16    if not severities:
17        print >> sys.stderr, "Usage: %s [info] [warning] [error]" % \
18                             (sys.argv[0],)
19        sys.exit(1)
20
21    for severity in severities:
22        channel.queue_bind(exchange='direct_logs',
23                           queue=queue_name,
24                           routing_key=severity)
25
26    print ' [*] Waiting for logs. To exit press CTRL+C'
27
28    def callback(ch, method, properties, body):
29        print " [x] %r:%r" % (method.routing_key, body,)
30
31    channel.basic_consume(callback,
32                          queue=queue_name,
33                          no_ack=True)
34
35    channel.start_consuming()

Wenn Sie nur die Protokollnachrichten "wraning" und "error" (außer "info") in einer Datei speichern möchten, öffnen Sie die Konsole und geben Sie Folgendes ein:

$ python receive_logs_direct.py warning error > logs_from_rabbit.log

Wenn Sie alle Protokollnachrichten auf dem Bildschirm anzeigen möchten, öffnen Sie ein neues Terminal und führen Sie Folgendes aus:

$ python receive_logs_direct.py info warning error
 [*] Waiting for logs. To exit press CTRL+C

Um beispielsweise eine "Fehler" -Protokollnachricht auszugeben, geben Sie einfach Folgendes ein:

$ python emit_log_direct.py error "Run. Run. Or it will explode."
 [x] Sent 'error':'Run. Run. Or it will explode.'

Fahren wir mit Tutorial 5 fort, um zu erfahren, wie Sie Nachrichten basierend auf Mustern empfangen.

Recommended Posts

RabbitMQ Tutorial 4 (Routing)
RabbitMQ Tutorial 6 (RPC)
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