RabbitMQ ist ein Nachrichtenwarteschlangenserver. Hier sehen wir uns die serverseitige Umgebung von Python+Pika+RabbitMQ an und sehen, wie Python zum Betrieb des RabbitMQ-Servers verwendet wird, um die Routing-Funktion der Nachrichtenwarteschlange zu implementieren 🎜>Python verwendet die Pika-Bibliothek (Installation: sudo pip install pika) und kann den RabbitMQ-Nachrichtenwarteschlangenserver betreiben (Installation: sudo apt-get install Rabbitmq-Server). Hier werfen wir einen Blick auf die MQ-bezogenen Routing-Funktionen.
Implementierung von Routing-SchlüsselnZum Beispiel gibt es ein Szenario, in dem Nachrichten an alle Empfänger gesendet werden müssen, aber wenn Sie eine freie Anpassung benötigen, ist dies bei einigen Nachrichten der Fall Einige Nachrichten werden an einige Empfänger gesendet. Was sollen wir tun? In diesem Fall werden Routing-Schlüssel verwendet.
Das Funktionsprinzip des Routing-Schlüssels: Wenn die Nachrichtenwarteschlange jedes Empfangsendes an den Switch gebunden ist, kann der entsprechende Routing-Schlüssel festgelegt werden. Wenn der Absender Informationen über den Switch sendet, kann er den Routing-Schlüssel angeben, und der Switch sendet die Nachricht basierend auf dem Routing-Schlüssel an die entsprechende Nachrichtenwarteschlange, sodass der Empfänger die Nachricht empfangen kann.
Nach dem vorherigen Artikel verwenden wir weiterhin send.py undempfangen.py, um die Funktion von Routing-Schlüsseln zu simulieren. send.py repräsentiert das sendende Ende und require.py repräsentiert das empfangende Ende. Die Funktion der Instanz besteht darin, drei Informationsebenen zu senden: Info, Warnung und Fehler an verschiedene Empfänger.
send.py-Codeanalyse
#!/usr/bin/env python #coding=utf8 import pika connection = pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel = connection.channel() #定义交换机,设置类型为direct channel.exchange_declare(exchange='messages', type='direct') #定义三个路由键 routings = ['info', 'warning', 'error'] #将消息依次发送到交换机,并设置路由键 for routing in routings: message = '%s message.' % routing channel.basic_publish(exchange='messages', routing_key=routing, body=message) print message connection.close()
receive.py-Codeanalyse
#!/usr/bin/env python #coding=utf8 import pika, sys connection = pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel = connection.channel() #定义交换机,设置类型为direct channel.exchange_declare(exchange='messages', type='direct') #从命令行获取路由键参数,如果没有,则设置为info routings = sys.argv[1:] if not routings: routings = ['info'] #生成临时队列,并绑定到交换机上,设置路由键 result = channel.queue_declare(exclusive=True) queue_name = result.method.queue for routing in routings: channel.queue_bind(exchange='messages', queue=queue_name, routing_key=routing) def callback(ch, method, properties, body): print " [x] Received %r" % (body,) channel.basic_consume(callback, queue=queue_name, no_ack=True) print ' [*] Waiting for messages. To exit press CTRL+C' channel.start_consuming()
Öffnen Sie zwei Terminals, eines führt den Code python retain.py info warning aus, was bedeutet, dass nur Info- und Warnmeldungen empfangen werden. Führen Sie send.py auf einem anderen Terminal aus und Sie können beobachten, dass das empfangende Terminal nur Info- und Warnmeldungen empfängt. Wenn Sie mehrere Terminals öffnen und „receive.py“ ausführen und verschiedene Routing-Schlüsselparameter übergeben, können Sie offensichtlichere Auswirkungen sehen.
Wenn die Empfangsseite läuft, können Sie Rabbitmqctl list_bindings verwenden, um den Bindungsstatus anzuzeigen.
Routing-Schlüssel-Fuzzy-MatchingRouting-Schlüssel-Fuzzy-Matching bedeutet, dass Sie reguläre Ausdrücke verwenden können, was sich von häufig verwendeten regulären Ausdrücken unterscheidet. Das Wort „#“ bedeutet hier „alle“, „alle“. ; „*“ entspricht nur einem Wort. Sie werden es verstehen, nachdem Sie die Beispiele gelesen haben.
Nach dem obigen Beispiel werden send.py und Receive.py weiterhin verwendet, um die Fuzzy-Matching-Funktion von Routing-Schlüsseln zu implementieren. send.py repräsentiert das sendende Ende und require.py repräsentiert das empfangende Ende. Die Funktion des Beispiels ist ungefähr folgende: Wenn Sie beispielsweise eine enge Freundin haben, können Sie mit ihr über Glück, Traurigkeit, Arbeit oder Leben sprechen. Es gibt auch einige Freunde, mit denen Sie glückliche Dinge teilen können ein paar Freunde, mit denen du glückliche Dinge teilen kannst. Du kannst mit ihr über unglückliche Dinge reden.
send.py-Codeanalyse
Da Routing-Schlüssel-Fuzzy-Matching erforderlich ist, muss der Schaltertyp auf „Thema“ eingestellt sein. Wenn er auf „Thema“ eingestellt ist, können Sie #, *-Matching-Symbole verwenden.
#!/usr/bin/env python #coding=utf8 import pika connection = pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel = connection.channel() #定义交换机,设置类型为topic channel.exchange_declare(exchange='messages', type='topic') #定义路由键 routings = ['happy.work', 'happy.life', 'sad.work', 'sad.life'] #将消息依次发送到交换机,并设定路由键 for routing in routings: message = '%s message.' % routing channel.basic_publish(exchange='messages', routing_key=routing, body=message) print message connection.close()
Im obigen Beispiel sind vier Arten von Nachrichten definiert. Sie sind leicht zu verstehen und werden dann nicht erläutert Sequenz.
Receive.py-Codeanalyse
Ebenso muss der Schaltertyp auf Thema eingestellt werden. Die Funktion zum Empfangen von Parametern über die Befehlszeile wurde leicht angepasst, d. h. es wird mit einem Fehler beendet, wenn keine Parameter vorhanden sind.
#!/usr/bin/env python #coding=utf8 import pika, sys connection = pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel = connection.channel() #定义交换机,设置类型为topic channel.exchange_declare(exchange='messages', type='topic') #从命令行获取路由参数,如果没有,则报错退出 routings = sys.argv[1:] if not routings: print >> sys.stderr, "Usage: %s [routing_key]..." % (sys.argv[0],) exit() #生成临时队列,并绑定到交换机上,设置路由键 result = channel.queue_declare(exclusive=True) queue_name = result.method.queue for routing in routings: channel.queue_bind(exchange='messages', queue=queue_name, routing_key=routing) def callback(ch, method, properties, body): print " [x] Received %r" % (body,) channel.basic_consume(callback, queue=queue_name, no_ack=True) print ' [*] Waiting for messages. To exit press CTRL+C' channel.start_consuming()
Öffnen Sie vier Terminals, von denen eines wie folgt läuft und anzeigt, dass Sie mit ihr über alles reden können:
python receive.py "#"
Ein weiteres Terminal läuft wie folgt und zeigt an, dass Sie glückliche Dinge mit ihr teilen können:
python receive.py "happy.*"
Der dritte Lauf bedeutet wie folgt, dass Arbeitsangelegenheiten mit ihr geteilt werden können:
python receive.py "*.work"
Der letzte führt python send.py aus. Das Ergebnis ist leicht vorstellbar, deshalb werde ich es hier nicht veröffentlichen.
Weitere Artikel zum Python-Betrieb des RabbitMQ-Servers zur Implementierung der Nachrichtenwarteschlangenweiterleitung finden Sie auf der chinesischen PHP-Website!