[PYTHON] Tutoriel RabbitMQ 5 (sujet)

Tutoriel Rabbit MQ 5 https://www.rabbitmq.com/tutorials/tutorial-five-python.html C'est une traduction de. Nous sommes impatients de signaler toute erreur de traduction.

Conditions préalables

Ce didacticiel suppose que RabbitMQ est installé et en cours d'exécution sur le port standard (5672) sur l'hôte local. Si vous souhaitez utiliser un hôte, un port ou des informations d'identification différents, vous devez ajuster vos paramètres de connexion.

Si un problème survient

Si vous rencontrez des problèmes grâce à ce tutoriel, vous pouvez nous contacter via la liste de diffusion.

sujet

(Utilisation du client Python Pika 0.9.8)

Dans le didacticiel précédent, nous avons amélioré le système de journalisation. Au lieu de l'échange en éventail, qui ne peut diffuser qu'un mannequin, il est désormais possible d'utiliser l'échange direct et de recevoir sélectivement les journaux.

Nous avons amélioré le système en utilisant les échanges directs, mais il y a encore des limites. L'échange direct ne permet pas le routage basé sur plusieurs critères.

Dans notre système de journalisation, nous souhaitons nous abonner non seulement en fonction de la gravité, mais également en fonction de la source qui publie le journal. Vous connaissez peut-être ce concept avec l'outil syslog d'Unix, il enregistre en fonction de la gravité (information / avertissement / critique ...) et de la facilité (auth / cron / kern ...). Route

Cet outil est très flexible, vous voudrez peut-être obtenir tous les journaux provenant de "kern", pas seulement les erreurs graves provenant de "cron".

Pour y parvenir avec notre système de journalisation, nous devons nous familiariser avec des échanges de sujets plus complexes.

Échange de sujets

Les messages envoyés à l'échange de sujets ne peuvent pas avoir de clé de routage, il doit s'agir d'une liste de mots séparés par des points. Le mot est arbitraire, mais spécifie généralement certaines caractéristiques liées au message. Exemples de clés de routage: "stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit". La clé de routage peut contenir n'importe quel nombre de mots, jusqu'à une limite de 255 octets.

La clé de liaison doit être du même format. La logique d'un échange de sujets est similaire à celle d'un échange direct: les messages envoyés avec une clé de routage particulière seront livrés à toutes les files d'attente combinées avec une clé de liaison correspondante. Cependant, il existe deux cas particuliers importants pour la liaison de clés:

\ * (Star) ne peut remplacer qu'un seul mot. \ # (Hash) peut remplacer zéro ou plusieurs mots.

C'est plus simple à expliquer avec un exemple:

(Figure)

Dans cet exemple, nous enverrons un message représentant l'animal. Le message est envoyé avec une clé de routage composée des trois mots suivants (et de deux points): Le premier mot de la clé de routage décrit «agilité», le deuxième mot «couleur» et le troisième mot «graine»: «(agilité). (Couleur). (Graine)»

Créez trois liaisons, "Q1" est combiné avec "\ *. Orange \ *" et "Q2" est combiné avec "\ *. \ *. Rabbit" et "lazy. #".

Ces liaisons peuvent être résumées comme suit:

"Q1" s'intéresse à tous les animaux orange. "Q2" veut tout entendre sur les lapins et tout sur les animaux paresseux.

Les messages avec la clé de routage définie sur "quick.orange.rabbit" seront envoyés aux deux files d'attente. Le message "lazy.orange.elephant" va également aux deux. D'un autre côté, "quick.orange.fox" va uniquement à la première file d'attente et "lazy.brown.fox" ne va qu'à la seconde. "lazy.pink.rabbit" correspond aux deux liaisons de la deuxième file d'attente, mais n'est livré qu'une seule fois à la deuxième file d'attente. "quick.brown.fox" ne correspond à aucune liaison et sera supprimé.

Que faire si vous ne respectez pas votre promesse et envoyez un message avec un seul mot ou quatre mots, tels que "orange" ou "quick.orange.male.rabbit"? Ces messages sont perdus car ils ne correspondent à aucune liaison.

D'autre part, "lazy.orange.male.rabbit" a quatre mots, mais il correspond à la dernière liaison et est livré à la deuxième file d'attente.

Échange de sujets

Les échanges de sujets sont puissants et peuvent se comporter comme n'importe quel autre échange.

La file d'attente est la clé de liaison "#Lorsqu'il est combiné avec (hachage), vous recevrez tous les messages, quelle que soit la clé de routage, comme un échange en éventail.

Caractère spécial"*"(Étoile),"#Lorsque "(hash) n'est pas utilisé dans la liaison, l'échange de rubrique se comporte comme un échange direct.

Tout résumé

Le système de journalisation utilise des échanges de sujets. Commençons par supposer que la clé de routage du journal a deux mots: "(Facility). (Severity)".

Le code est presque le même que celui du tutoriel précédent.

Code de 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 pour 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()

Pour recevoir tous les journaux:

python receive_logs_topic.py "#"

Pour recevoir tous les journaux de l'installation "kern":

python receive_logs_topic.py "kern.*"

Si vous souhaitez uniquement entendre le journal "critique":

python receive_logs_topic.py "*.critical"

Vous pouvez générer plusieurs liaisons:

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

Pour publier un journal de la clé de routage "kern.critical":

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

Jouez avec ce programme. Notez que le code ne fait pas d'hypothèses sur les clés de routage ou de liaison, il peut être exécuté avec des paramètres pour plus d'une clé de routage.

Quelques défis:

La liaison "\ *" interceptera-t-elle les messages envoyés avec une clé de routage vide? "#. \ *" Capture-t-il les messages saisis par la chaîne ".."? Voulez-vous capturer un message clé d'un seul mot? Quelle est la différence entre "a. \ *. #" Et "a. #"?

Passez au didacticiel 6 pour en savoir plus sur RPC.

Recommended Posts

Tutoriel RabbitMQ 5 (sujet)
Tutoriel RabbitMQ 6 (RPC)
Tutoriel RabbitMQ 4 (Routage)
Didacticiel RabbitMQ 2 (file d'attente de travail)
Tutoriel RabbitMQ 3 (Publier / S'abonner)
Tutoriel RabbitMQ 1 ("Hello World!")
didacticiel sqlalchemy
Tutoriel PyODE 2
Tutoriel Python
Tutoriel PyODE 1
Tutoriel PyODE 3
Tutoriel du didacticiel TensorFlow