Tutoriel Rabbit MQ 1 https://www.rabbitmq.com/tutorials/tutorial-one-python.html C'est une traduction de. Nous sommes impatients de signaler toute erreur de traduction.
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 vous rencontrez des problèmes grâce à ce tutoriel, vous pouvez nous contacter via la liste de diffusion.
RabbitMQ est un courtier de messages. L'idée principale est très simple: accepter et livrer les messages. Vous pouvez le considérer comme un bureau de poste: lorsque vous écrivez une lettre à une poste, vous êtes certain que le facteur finira par la remettre au destinataire. Selon cette métaphore, RabbitMQ est un poste, un bureau de poste et un facteur.
La grande différence entre RabbitMQ et le bureau de poste est le fait qu'il ne gère pas le papier, mais accepte, stocke et délivre des blobs binaires de messages de données.
RabbitMQ et la messagerie utilisent généralement plusieurs termes techniques.
"Production" est la transmission elle-même. Le programme qui envoie le message est le "producteur". Nous le dessinons avec un «P» comme ceci:
"Queue" est le nom de la boîte aux lettres. C'est à l'intérieur du Rabbit MQ. Le message passe par RabbitMQ et l'application, mais n'est stocké que dans la «file d'attente». Une "file d'attente" n'est liée par aucune restriction, elle peut stocker autant de messages que vous le souhaitez, c'est un tampon essentiellement infini. De nombreux «producteurs» peuvent envoyer des messages à une «file d'attente» et de nombreux «consommateurs» peuvent essayer de recevoir des données d'une «file d'attente». La "file d'attente" a son nom en haut et est dessinée comme suit:
«Consommer» a le même sens que recevoir. Un "consommateur" est un programme qui attend principalement qu'un message soit reçu. Nous le dessinons avec «C»:
Gardez à l'esprit que les producteurs, les consommateurs et les courtiers n'ont pas besoin d'être sur la même machine. En fait, ce n'est pas le cas pour la plupart des applications.
Hello World!
Notre "Hello World" n'est pas trop compliqué, envoyons un message, recevons-le et imprimons-le à l'écran. Vous avez besoin de deux programmes pour ce faire, l'un pour envoyer un message et l'autre pour le recevoir et le sortir.
La conception générale ressemble à ceci:
Le producteur envoie un message à la file d'attente «bonjour». Le consommateur reçoit un message de cette file d'attente.
Bibliothèque Rabbit MQ
RabbitMQ utilise plusieurs protocoles. Celui couvert dans ce tutoriel est appelé AMQP 0-9-1. Pour utiliser RabbitMQ, vous avez besoin d'une bibliothèque qui comprend le même protocole que RabbitMQ. Une bibliothèque pour presque tous les langages de programmation est disponible. Vous pouvez également choisir parmi plusieurs bibliothèques en Python. * pika * py-amqp * py-amqplib Une série de tutoriels utilisera Pika, qui est la bibliothèque recommandée par l'équipe Rabbit MQ. Vous pouvez utiliser l'outil de gestion des packages pip pour l'installation.
$ sudo pip install pika==0.9.8
Cette installation dépend des packages pip et git-core, vous devez d'abord les installer.
Pour Ubuntu:
$ sudo apt-get install python-pip git-core
Pour Debian:
$ sudo apt-get install python-setuptools git-core
$ sudo easy_install pip
Pour Windows: pour installer easy_install, exécutez le programme d'installation de Windows pour setuptools.
> easy_install pip
> PIP install pika==0.9.8
Le premier programme, send.py, envoie un seul message à la file d'attente. La première chose à faire est d'établir une connexion avec le serveur Rabbit MQ.
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
'localhost'))
channel = connection.channel()
Nous nous connectons maintenant à un courtier sur notre machine locale («localhost»). Si vous souhaitez vous connecter à un courtier sur une autre machine, spécifiez simplement le nom de la machine ou l'adresse IP ici.
Ensuite, vous devez vous assurer que la file d'attente du destinataire existe avant de pouvoir l'envoyer. Si vous envoyez un message à un emplacement qui n'existe pas, RabbitMQ rejette simplement le message. Créez une file d'attente pour remettre le message et nommez-le «bonjour»:
channel.queue_declare(queue='hello')
Vous êtes maintenant prêt à envoyer le message. Notre premier message contient la chaîne "* Hello World! *" Et l'envoie à la file d'attente * hello *.
RabbitMQ n'envoie pas de messages directement à la file d'attente, il doit toujours passer par * exchange *. Mais n'abordons pas les détails ici, vous pouvez en savoir plus sur * exchange * dans la partie 3 de ce tutoriel. Tout ce que vous devez savoir maintenant, c'est comment utiliser le * exchange * par défaut, qui est identifié par une chaîne vide. Cet * échange * est spécial, il vous permet de spécifier exactement dans quelle file d'attente le message doit aller. Vous devez spécifier le nom de la file d'attente dans le paramètre routing_key:
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print " [x] Sent 'Hello World!'"
Avant de quitter le programme, vous devez vous assurer que la mémoire tampon du réseau est vidée pour vous assurer que le message est effectivement remis à RabbitMQ. Vous pouvez le faire en fermant la connexion gentlemanly.
connection.close()
Envoyer ne fonctionne pas!
Le deuxième programme, receive.py, reçoit le message de la file d'attente et le sort à l'écran.
Encore une fois, vous devez d'abord vous connecter au serveur Rabbit MQ. Le code pour se connecter à Rabbit MQ est le même que précédemment.
L'étape suivante consiste à s'assurer que la file d'attente existe, comme auparavant. Créer une file d'attente à l'aide de queue_declare est dommage, vous pouvez exécuter cette commande autant de fois que vous le souhaitez, et une seule sera créée.
channel.queue_declare(queue='hello')
Vous vous demandez peut-être pourquoi vous déclarez à nouveau la file d'attente, vous l'avez déjà déclarée dans le code précédent. Vous pouvez éviter cela si vous êtes sûr que la file d'attente existe déjà. Par exemple, si le programme send.py a déjà été exécuté. Mais nous ne savons toujours pas quel programme fonctionnera en premier. Dans de tels cas, il est recommandé que les deux programmes déclarent la file d'attente à plusieurs reprises.
Liste des files d'attente
Vous pouvez voir quelle file d'attente se trouve dans RabbitMQ et combien de messages il y a. Vous pouvez le faire (en tant qu'utilisateur privilégié) en utilisant l'outil rabbitmqctl:
$ sudo rabbitmqctl list_queues
Listing queues ...
hello 0
...done.
(Sudo omis sous Windows)
Recevoir un message d'une file d'attente est plus compliqué. Cela fonctionne en enregistrant une fonction de rappel dans la file d'attente. Cette fonction de rappel est appelée par la bibliothèque Pika chaque fois qu'un message est reçu. Pour ce didacticiel, cette fonction imprime le contenu du message à l'écran.
def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)
Ensuite, vous devez dire à RabbitMQ que cette fonction de rappel doit recevoir un message de la file d'attente «bonjour».
channel.basic_consume(callback,
queue='hello',
no_ack=True)
La file d'attente d'abonnement doit exister pour que cette commande réussisse. Heureusement, c'est sûr, je viens de créer une file d'attente en utilisant queue_declare.
Le paramètre no_ack sera décrit plus tard.
Et enfin, il entre dans une boucle sans fin, attendant des données et exécutant des rappels au besoin.
print ' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()
Code complet pour send.py:
1 #!/usr/bin/env python
2 import pika
3
4 connection = pika.BlockingConnection(pika.ConnectionParameters(
5 host='localhost'))
6 channel = connection.channel()
7
8 channel.queue_declare(queue='hello')
9
10 channel.basic_publish(exchange='',
11 routing_key='hello',
12 body='Hello World!')
13 print " [x] Sent 'Hello World!'"
14 connection.close()
Code complet pour receive.py:
1 #!/usr/bin/env python
2 import pika
3
4 connection = pika.BlockingConnection(pika.ConnectionParameters(
5 host='localhost'))
6 channel = connection.channel()
7
8 channel.queue_declare(queue='hello')
9
10 print ' [*] Waiting for messages. To exit press CTRL+C'
11
12 def callback(ch, method, properties, body):
13 print " [x] Received %r" % (body,)
14
15 channel.basic_consume(callback,
16 queue='hello',
17 no_ack=True)
18
19 channel.start_consuming()
Vous pouvez maintenant essayer le programme dans le terminal. Commençons par envoyer un message à l'aide du programme send.py:
$ python send.py
[x] Sent 'Hello World!'
Le programme producteur send.py s'arrêtera après toutes les exécutions. Recevons-le:
$ python receive.py
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World!'
Banzai! J'ai pu envoyer le premier message via RabbitMQ. Comme vous l'avez peut-être remarqué, le programme receive.py ne se ferme pas. Vous pouvez rester en préparation pour recevoir plus de messages et interrompre avec Ctrl-C.
Essayez à nouveau d'exécuter send.py dans un nouveau terminal.
Vous avez appris à envoyer et à recevoir des messages à partir de files d'attente nommées. Passons à la partie 2 et construisons une file d'attente de travail simple.
Recommended Posts