Manipuler rabbimq avec python

introduction

RabbitMq vous permet d'échanger des messages entre le logiciel et les messages de mise en file d'attente (AMQP). Il existe de nombreux sites qui décrivent comment l'utiliser, mais il y en a peu qui décrivent réellement comment gérer les messages, j'ai donc tout résumé de la préparation de Rabbit Mq et python pika à la vérification des messages.

environnement

Ce dont vous avez besoin pour utiliser Rabbit Mq

  1. Serveur RabbitMq: ce qui reçoit et envoie les messages (où stocker les messages)
  2. producteur: celui qui envoie le message (client)
  3. consommateur: celui qui reçoit le message (hôte)

1. Préparation du lapin Mq

Obtenez l'image Rabbit Mq de docker

Il existe deux images RabbitMq, celle standard et celle avec le plug-in de gestion activé. Cette fois, je veux voir l'état de la file d'attente, donc je vais retirer celui du plug de gestion. Un conteneur est fourni avec le nom rabbitmq, alors tirez l'image.

docker pull rabbitmq:3-management

Pour un rabbitmq normal, tirez sur rabbitmq` au lieu de `` rabbitmq: 3-management` ''.

Démarrer Rabbit Mq

Démarrez RabbitMq. Cette fois, j'ai ajouté l'option -d `` parce que je veux qu'elle continue de fonctionner en arrière-plan. De plus, comme je veux voir l'écran de gestion du port, je lie 15672 dans le conteneur à 8080 sur l'hôte, et le port qui échange réellement les files d'attente à 5672 dans le conteneur et 5672 sur l'hôte. De plus, le nom `` `` --hostname '' est utilisé pour identifier la file d'attente.

docker run -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 8080:15672 rabbitmq:3-management

Pour rabbitmq normal, exécutez `rabbitmq `au lieu de` rabbitmq: 3-management`` `` et vous n'avez même pas besoin de ``-p 8080: 15672`` `.

Confirmation du démarrage de Rabbit Mq

Cette fois, j'ai démarré un conteneur avec le plug-in de gestion activé, donc j'accéderai à localhost: 8080` '' depuis le navigateur et jetterai un œil au contenu. Lorsque vous y accédez, vous serez redirigé vers l'écran de connexion, alors entrez avec le paramètre par défaut invité ''. Vous pouvez voir l'état actuel. Nodes contient le nom que vous avez spécifié précédemment avec --hostname` ``.

manage_rabbitmq.png

2. producteur: préparez celui qui enverra le message (client)

Pour créer un producteur, python échange des files d'attente, nous utilisons donc une bibliothèque appelée pika pour accéder à rabbitmq.

Installer pika

L'installation de pika se fait normalement avec pip.

pip install pika

mise en œuvre du producteur

Les étapes suivantes sont nécessaires pour envoyer un message. Toutes ces étapes sont effectuées pour rabbitmq, donc aucun consommateur n'est nécessaire.

Créer une connexion

Connectez-vous de python à Rabbit Mq. Donnez des paramètres tels que le nom d'hôte (adresse IP), le numéro de port et le délai d'attente aux paramètres à créer. Étant donné que le conteneur RabbitMq est lié au port 5672 de l'hôte, j'ai donné localhost comme paramètre et ne l'ai pas spécifié car le port reste le 5672 par défaut. Après cela, donnez les paramètres pour créer une connexion et terminer la connexion.

client_main.py



import pika

pika_param = pika.ConnectionParameters('localhost')
connection = pika.BlockingConnection(pika_param)

Création / acquisition de chaîne

Une fois la connexion établie, l'étape suivante consiste à créer le canal. Un canal est comme une route vers Rabbit Mq. Les producteurs et les consommateurs ayant le même canal sont les cibles de l'échange de messages.

client_main.py



import pika

pika_param = pika.ConnectionParameters('localhost')
connection = pika.BlockingConnection(pika_param)
channel = connection.channel()

Seule la dernière ligne a été ajoutée. Entrez le numéro d'identification du canal dans cet argument si nécessaire.

Création / acquisition de file d'attente

Après avoir créé le canal, créez la file d'attente. Cette file d'attente est comme un endroit pour stocker les messages. Par conséquent, les messages ne peuvent pas être échangés à moins que les noms de file d'attente ne soient identiques. Contrairement au canal, vous devez le spécifier.

client_main.py


import pika

pika_param = pika.ConnectionParameters('localhost')
connection = pika.BlockingConnection(pika_param)
channel = connection.channel()

channel.queue_declare(queue='hello')

Seule la dernière ligne a été ajoutée. Entrez les paramètres de file d'attente dans cet argument si nécessaire.

Envoyer le message

Maintenant que nous sommes prêts, nous vous enverrons un message. Dans `basic_publish ()` `route_key `, spécifiez le nom de la file d'attente et spécifiez le message que vous voulez envoyer à` body ''.

client_main.py


import pika

pika_param = pika.ConnectionParameters('localhost')
connection = pika.BlockingConnection(pika_param)
channel = connection.channel()

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')

connection.close()

Enfin, fermez la connexion lorsque la transmission est terminée.

Je vais effectivement l'envoyer

Maintenant que nous avons une source à envoyer à RabbitMq, exécutons-la. La commande reviendra bientôt.

PS C:\Users\xxxx\program\python\pika> python .\client_main.py

Je vais également le vérifier sur l'écran de gestion de Rabbit Mq. Si vous regardez l'onglet Files d'attente, vous pouvez voir que le message est prêt: 1.

queue_set.png

3. consommateur: préparez celui (hôte) à recevoir le message

Les consommateurs utilisent également une bibliothèque appelée pika pour accéder à RabbitMq afin d'échanger des files d'attente avec python.

Mise en œuvre du consommateur

Les étapes suivantes sont nécessaires pour envoyer un message. Toutes ces étapes sont effectuées pour Rabbit Mq, vous n'avez donc pas besoin d'un producteur pour le démarrer. De la création de la connexion à la création de la file d'attente, c'est comme le producteur.

--Créer une connexion --Création / acquisition de canaux --Création / acquisition de queues --Création d'un callback (traitement à la réception)

Créer un callback (traitement à la réception)

Décrivez la fonction que vous souhaitez traiter lors de la réception d'un message. Spécifiez la fonction de réponse basic_ack () '' pour supprimer le message de la file d'attente puisqu'il a été reçu à la fin de la fonction. Cette fois, à titre d'exemple, la fonction callback '' qui affiche le message reçu est décrite.

host_main.py


import pika

pika_param = pika.ConnectionParameters(host='localhost')
connection = pika.BlockingConnection(pika_param)
channel = connection.channel()

channel.queue_declare(queue='hello')
![queue_receive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481713/d78bd155-4b9a-9093-998d-c85ff4af2cc7.png)
![queue_receive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481713/f6fbd5ef-322d-77d0-8e85-68626ac91783.png)

def callback(ch, method, properties, body):
    print("{} Received".format(body))
    ch.basic_ack(delivery_tag = method.delivery_tag)

Commencer à accepter les messages de la file d'attente

Spécifiez le nom de la file d'attente et la fonction de rappel dans basic_consume () '' du canal créé. Puis commencez à recevoir le message avec la fonction start_consuming () ''. Lorsque cette fonction est lancée, elle attend un message sans fin dans la fonction, donc quand elle se termine, il est nécessaire de mettre un déclencheur pour une terminaison forcée ou une terminaison dans la fonction de rappel.

host_main.py


import pika

pika_param = pika.ConnectionParameters(host='localhost')
connection = pika.BlockingConnection(pika_param)
channel = connection.channel()

channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
    print("{} Received".format(body))
    ch.basic_ack(delivery_tag = method.delivery_tag)

channel.basic_consume(
    queue='hello', on_message_callback=callback)

channel.start_consuming()

Recevoir en fait

Maintenant que nous avons une source pour recevoir de RabbitMq, exécutons-la.

PS C:\Users\xxxx\program\python\pika> python .\host_main.py
b'Hello World!' Received

Vous pouvez confirmer que le message envoyé par le producteur peut être reçu et édité en standard.

Je vais également le vérifier sur l'écran de gestion de Rabbit Mq. Si vous regardez l'onglet Files d'attente, vous pouvez voir que le message est prêt: 0.

queue_receive.png

en conclusion

J'ai résumé comment échanger des messages avec python en utilisant RabbitMq. Cependant, c'est presque le même que le contenu officiel. En utilisant cela, il semble que le traitement asynchrone et le traitement lié aux files d'attente puissent être facilement exécutés.

Recommended Posts

Manipuler rabbimq avec python
Gérez Excel avec python
[Astuces] Gérez Athena avec Python
Gérez les clés Base91 avec python + redis.
Gérez facilement les listes avec python + sqlite3
Gérer les fichiers Excel CSV avec Python
FizzBuzz en Python3
Grattage avec Python
Grattage avec Python
Python avec Go
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Essayer de gérer SQLite3 avec Python [Note]
Communication série avec Python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Grattage avec Python + PhantomJS
Conduisez WebDriver avec python
[Python] Redirection avec CGIHTTPServer
Analyse vocale par python
Pensez à yaml avec python
Utiliser Kinesis avec Python
Utiliser DynamoDB avec Python
Getter Zundko avec python
Loi d'Ohm avec Python
Exécutez Blender avec python
Python à partir de Windows 7
Carte thermique par Python + matplotlib
Multi-processus de manière asynchrone avec python
Programmation Python avec Atom