[PYTHON] Tutoriel RabbitMQ 4 (Routage)

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

routage

(Utilisation du client Python Pika 0.9.8)

Dans le didacticiel précédent, nous avons construit un système de journalisation simple. J'ai pu diffuser le message du journal à de nombreux destinataires.

Dans ce tutoriel, nous y ajouterons des fonctionnalités, qui vous permettront de vous abonner à une partie seulement du message. Par exemple, vous pouvez afficher uniquement les messages d'erreur fatale dans le fichier journal (pour économiser de l'espace disque) et continuer à afficher tous les messages sur la console.

contraignant

Dans l'exemple précédent, vous avez déjà généré la liaison. Vous vous souviendrez du code comme celui-ci:

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

Les liaisons sont les relations entre les échanges et les files d'attente. On peut lire que cette file d'attente s'intéresse aux messages de cet échange.

La liaison peut prendre un paramètre routing_key supplémentaire. Pour éviter toute confusion avec les paramètres de basic_publish, nous l'appellerons la clé de liaison. Les liaisons avec des clés peuvent être générées comme suit:

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

La signification de la clé de liaison dépend du type d'échange. Les échanges de fanout précédemment utilisés ignoraient simplement cette valeur.

Échange direct

Le système de journalisation du didacticiel précédent diffuse tous les messages à tous les consommateurs. Je voudrais étendre cela afin que les messages puissent être filtrés en fonction de la gravité. Par exemple, vous pouvez écrire uniquement les messages du journal des erreurs fatales que vous recevez sur le disque afin de ne pas gaspiller d'espace disque avec des messages d'avertissement ou de journal de niveau information.

L'échange de fanout que j'ai utilisé jusqu'à présent n'est pas très flexible, il ne peut diffuser qu'à l'aveugle.

Utilisez plutôt l'échange direct. L'algorithme de routage d'échange direct est simple: le message va dans une file d'attente avec une clé de liaison qui correspond exactement à la clé de routage.

Pour des raisons d'explication, tenez compte des paramètres suivants:

(Figure)

Dans ce cadre, il y a un échange direct "X" et deux files d'attente combinées avec lui. La première file d'attente a deux liaisons avec la clé de liaison "orange" et la seconde file d'attente a deux liaisons, l'une avec la clé de liaison "noire" et l'autre avec la clé de liaison "verte". ..

Avec une telle configuration, la publication vers l'échange de messages avec la clé de routage "orange" sera acheminée vers la file d'attente "Q1". Les messages avec une clé de routage «noire» ou «verte» vont à «Q2». Tous les autres messages seront supprimés.

Liaisons multiples

Il est parfaitement bien de combiner plusieurs files d'attente avec la même clé de liaison. Dans cet exemple, vous pouvez ajouter une jointure de clé «noire» entre «X» et «Q1». Dans ce cas, l'échange direct se comporte comme un fanout, diffusant le message à toutes les files d'attente correspondantes. Les messages avec la clé de routage "noire" seront envoyés à la fois à "Q1" et "Q2".

Émission de journaux

Utilisez ce modèle pour votre système de journalisation. Envoyez un message à Direct Exchange au lieu de diffuser. Donne la gravité du journal comme clé de routage. Ce faisant, le script de réception peut sélectionner la gravité qu'il souhaite recevoir. Concentrons-nous d'abord sur la publication des journaux.

Comme toujours, vous devez d'abord générer l'échange:

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

Et vous êtes prêt à envoyer un message:

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

Par souci de simplicité, la gravité est l'une des «info», «avertissement» et «erreur».

Souscrire

La réception d'un message fonctionne de la même manière que dans le didacticiel précédent, à une exception près, en générant une nouvelle liaison pour chaque gravité d'intérêt.

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)

Tout résumé

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

Si vous souhaitez enregistrer uniquement les messages de journal "wraning" et "error" (à l'exclusion des "info") dans un fichier, ouvrez la console et tapez:

$ python receive_logs_direct.py warning error > logs_from_rabbit.log

Si vous voulez voir tous les messages du journal à l'écran, ouvrez un nouveau terminal et exécutez:

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

Et, par exemple, pour émettre un message de journal "d'erreur", tapez simplement:

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

Passons au didacticiel 5 pour apprendre à recevoir des messages basés sur des modèles.

Recommended Posts

Tutoriel RabbitMQ 4 (Routage)
Tutoriel RabbitMQ 6 (RPC)
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