[PYTHON] Tutoriel RabbitMQ 1 ("Hello World!")

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.

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.

introduction

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.

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!

(Utilisation du client Python Pika 0.9.8)

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

Envoyer

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!

Si vous êtes nouveau sur RabbitMQ et que vous ne voyez pas de message «envoyé», vous vous demandez peut-être ce qui ne va pas. Le courtier peut avoir démarré sans suffisamment d'espace disque libre (nécessite au moins 1 Go d'espace libre par défaut) et refusé d'accepter le message. Vérifiez le fichier journal du courtier et supprimez les contraintes si nécessaire. La documentation du fichier de configuration montre comment définir disk_free_limit.

Recevoir

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()

Tout résumé

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

Tutoriel RabbitMQ 1 ("Hello World!")
Bonjour le monde
Tutoriel RabbitMQ 5 (sujet)
Pymacs helloworld
Tutoriel RabbitMQ 6 (RPC)
Tutoriel Rabbit MQ (1) - De l'installation à Hello World (traduction du site officiel)
Tutoriel RabbitMQ 4 (Routage)
cython helloworld
Tutoriel Flask (de l'installation à Hello World)
Didacticiel RabbitMQ 2 (file d'attente de travail)
web2py Remarque: Bonjour le monde
Bonjour le monde avec Docker
Hello World avec Django
Le premier Hello World de Django
Bonjour le monde sur flacon
Dessinez bonjour le monde avec mod_wsgi
Bonjour le monde avec Flask + Hamlish
Jusqu'à bonjour le monde avec zappa
Hello World en langue GO
Hello World (débutant) avec Django
Python commençant par Hello world!
Faisons "Hello World" en 40 langues! !!
Bonjour tout le monde! Avec la communication CAN virtuelle
Introduction à TensorFlow - Hello World Edition
Tutoriel RabbitMQ 5 (sujet)
Tutoriel RabbitMQ 6 (RPC)
Tutoriel RabbitMQ 4 (Routage)
Didacticiel RabbitMQ 2 (file d'attente de travail)
Tutoriel RabbitMQ 1 ("Hello World!")
Bonjour tout le monde! (Chaîne de blocs viables minimum)
[Note] Sortie Hello world avec python
cout << "Hello, World! \ N" en python
Hello World avec Flask [Mémo approprié]
Code: 2 "Hello World" dans "Choregraphe-Python script"
Hello World! Par QPython avec Braincrash
Python #Hello World pour les super débutants
Introduction à Ansible Partie 1 Hello World !! '
[Python] Application Web à partir de 0! Pratique (2) -Bonjour le monde-
Hello World et détection de visage avec opencv-python 4.2
Bonjour le monde avec Raspberry Pi + Minecraft Pi Edition
Comment créer Hello, World avec #Nix
Bonjour tout le monde pas localhost à Django
(Pour moi) Django_1 (Basic / Hello World / Template)
Comment afficher Hello World en python
Hello World! Par QPython avec Brainfu * k