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.
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é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`` `.
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` ``.
Pour créer un producteur, python échange des files d'attente, nous utilisons donc une bibliothèque appelée pika pour accéder à rabbitmq.
L'installation de pika se fait normalement avec pip.
pip install pika
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.
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)
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.
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.
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.
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.
Les consommateurs utilisent également une bibliothèque appelée pika pour accéder à RabbitMq afin d'échanger des files d'attente avec python.
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)
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)
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()
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.
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