J'apprends Rabbit MQ, qui est un représentant de l'open source MQ. Pour le moment, j'ai essayé Tutoriel sur le site officiel, donc je l'ai traduit pour ma propre compréhension. J'espère que ça t'aide.
Ce chapitre ne fait pas partie du tutoriel sur le site officiel, mais j'écrirai d'abord la procédure d'installation.
Vérifiez Documents sur le site officiel. Voici la procédure pour Ubuntu.
deb http://www.rabbitmq.com/debian/ testing main
--Enregistrer la clé publique
wget https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
sudo apt-key add rabbitmq-signing-key-public.asc
--Mettre à jour la liste des paquets avec apt-get update
sudo apt-get update
--Installation
sudo apt-get install rabbitmq-server
Vous pouvez l'installer avec pip.
sudo pip install pika
Lorsque vous êtes prêt, passons au didacticiel.
Tutorial 1: Hello World
Rabbit MQ est un courtier de messages. L'idée principale est très dé à coudre, "recevoir et transférer des messages". Pensez-y comme un bureau de poste: lorsque vous postez une lettre à une poste, vous êtes sûr qu'un coursier de la poste livrera éventuellement la lettre à sa destination. En appliquant le rôle de Rabbit MQ à cette analogie, il joue le rôle de poste, de bureau de poste et de livreur.
La différence entre RabbitMQ et le bureau de poste est qu'il traite des morceaux de données, c'est-à-dire messages, plutôt que du papier. Rabbit MQ le reçoit, le stocke et le transfère.
RabbitMQ et les systèmes de messagerie courants utilisent certains termes techniques.
--_ Produire_ signifie envoyer. Le programme qui envoie est appelé Producer (ci-après dénommé «producteur» en Katakana). Nous utiliserons l'abréviation "P" dans les illustrations des programmes qui apparaîtront dans les prochains tutoriels.
--_ queue_ est comme une boîte aux lettres qui stocke des lettres (ci-après dénommée «file d'attente» dans un pseudonyme). Cela fonctionne à l'intérieur de Rabbit MQ. Lorsque votre application envoie un message via Rabbit MQ, il est simplement mis en file d'attente. Vous pouvez stocker autant de messages que vous le souhaitez dans la file d'attente - essentiellement un tampon infini. Plusieurs producteurs peuvent envoyer des messages à une file d'attente et plusieurs consommateurs peuvent recevoir des messages d'une même file d'attente. Dans les illustrations des prochains didacticiels, nous utiliserons l'illustration suivante avec le nom de la file d'attente ajouté ci-dessus.
--_ Consommer_ signifie près de recevoir. Le programme qui attend qu'un message soit reçu est appelé Consumer (ci-après dénommé "consommateur" en Katakana). Dans les illustrations du tutoriel, nous utiliserons l'abréviation "C".
Gardez à l'esprit que les producteurs, les consommateurs et les courtiers (serveurs RabbitMQ) n'ont pas à vivre ensemble sur la même machine. En fait, de nombreuses applications sont configurées pour les placer séparément.
Hello World!
Ce rayon de programme Hello World n'est pas très compliqué. Envoyons un message et imprimons-le à l'écran. Pour ce faire, vous avez besoin de deux programmes: un qui envoie le message et un qui reçoit et sort le message.
La conception générale ressemble à ceci:
Producer (P) envoie un message à la file d'attente "Hello". Le consommateur (C) reçoit un message de la file d'attente.
__ À propos de la bibliothèque RabbitMQ: __ RabbitMQ utilise AMQP 0.9.1 qui est un protocole de messagerie ouvert et polyvalent pour la communication. Les clients compatibles Rabbit MQ sont disponibles dans plusieurs langues. Le pika utilisé dans ce tutoriel est le client Python recommandé par l'équipe Rabbit MQ.
Créez un programme d'envoi send.py. (code complet) 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()
Dans cet exemple, nous nous connectons à un courtier hôte local (serveur RabbitMQ). Si vous souhaitez vous connecter à un courtier sur une machine externe, spécifiez simplement l'adresse IP ou le nom d'hôte dans la partie localhost
.
La file d'attente de destination doit déjà exister lors de l'envoi d'un message. Si vous envoyez un message à une file d'attente qui n'existe pas, RabbitMQ supprimera le message. Cette fois, créons cette file d'attente en l'envoyant à une file nommée Hello
:
channel.queue_declare(queue='hello')
Vous êtes maintenant prêt à envoyer un message. Je souhaite envoyer un message contenant uniquement le mot «Hello World!» À la file d'attente «Hello».
Dans RabbitMQ, les messages sont toujours envoyés via un composant appelé échange, plutôt que d'être envoyés directement à la file d'attente, mais je ne vais pas approfondir les détails pour le moment (abordés dans le didacticiel 3). Pour l'instant, apprenons à utiliser l'échange par défaut en spécifiant un caractère vide (''
). Cet échange est spécial et vous permet de spécifier directement à quelle file d'attente envoyer le message. Le nom de la file d'attente de destination est spécifié dans le paramètre clé_acheminement
:
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 le tampon réseau est vidé et que le message est correctement envoyé à RabbitMQ. Vous pouvez faire ces choses et fermer la connexion avec le code ci-dessous.
connection.close()
__ L'envoi ne fonctionne pas __ Si c'est la première fois que vous utilisez Rabbit MQ et que vous rencontrez des difficultés pour envoyer des messages, vous vous demandez peut-être ce qui ne va pas. Peut-être que le courtier (serveur RabbitMQ) démarre sans suffisamment d'espace disque (un minimum de 1 Go d'espace est requis). Dans ce cas, Rabbit MQ n'acceptera pas le message. Vérifiez le fichier journal et réduisez le paramètre de limite d'espace disque minimal requis (
disk_free_limit
) si nécessaire. documentation du fichier de configuration décrit comment configurer.
Le deuxième programme, receive.py, reçoit le message de la file d'attente et le sort à l'écran. (code complet)
Tout d'abord, connectez-vous au serveur Rabbit MQ. Ce code est similaire à send.py.
Appelez ensuite queue_declare
pour vous assurer qu'il y a une file d'attente à utiliser. Cette méthode garantit l'égalité de puissance et ne fait rien si la file d'attente spécifiée existe déjà. Par conséquent, vous pouvez appeler autant de fois que vous le souhaitez. (Une seule file d'attente avec le même nom sera créée)
channel.queue_declare(queue='hello')
Vous vous demandez peut-être pourquoi vous souhaitez déclarer à nouveau la file d'attente dans le code send.py. La raison est de s'assurer que la file d'attente n'existe pas. Si vous lancez toujours send.py en premier, il n'y a pas de problème (si vous déclarez la file d'attente uniquement avec send.py), mais nous avons décidé lequel lancer en premier, send.py ou receive.py. ne pas. Dans ces cas, il est recommandé d'écrire une déclaration de file d'attente (queue_declare
) dans les deux programmes.
__ Liste des files d'attente __ Vous voudrez peut-être voir le nombre de files d'attente de votre Rabbit MQ et le nombre de messages que vous avez. Dans ce cas, exécutez l'outil
rabbitmqctl
en tant qu'utilisateur autorisé:
$ sudo rabbitmqctl list_queues Listing queues ... hello 0 ...done.
Recevoir des messages de la file d'attente est un peu compliqué. Vous pouvez déplacer le processus en enregistrant la fonction callback
dans la file d'attente. Chaque fois qu'un message est reçu, la fonction callback
est appelée depuis la bibliothèque Pika. Cette fois, cette fonction imprime le contenu du message à l'écran.
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
Puis dites à RabbitMQ d'appeler ce rappel quand il reçoit un message de hello
:
channel.basic_consume(callback,
queue='hello',
no_ack=True)
Cette commande échouera s'il n'y a pas de file d'attente à enregistrer. Heureusement, nous avons mentionné queue_declare
avant cela, nous pouvons donc être sûrs que la file d'attente existe.
Le paramètre no_ack
est traité dans le Tutoriel 2.
Enfin, nous entrons dans une boucle infinie qui écoute les données et conduit les rappels:
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
send.py
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()
receive.py
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
channel.basic_consume(callback,
queue='hello',
no_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
Depuis le terminal, essayez le programme. Tout d'abord, exécutez send.py pour envoyer un message:
$ python send.py
[x] Sent 'Hello World!'
Le programme producteur send.py se fermera dès que vous l'envoyez. Maintenant recevons le message:
$ python receive.py
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World!'
Hourra! Vous avez bien envoyé et reçu le premier message à l'aide de RabbitMQ. Comme vous l'avez peut-être remarqué, reveive.py ne se ferme pas lorsqu'il reçoit un message et attend le message suivant. Appuyez sur Ctrl-C pour quitter.
Dans ce didacticiel, nous avons appris à envoyer et à recevoir des messages à l'aide de files d'attente nommées. Dans le didacticiel 2, vous allez créer une seule file d'attente de travail.
Recommended Posts