[PYTHON] Tutoriel Rabbit MQ (1) - De l'installation à Hello World (traduction du site officiel)

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.

Préparation

Ce chapitre ne fait pas partie du tutoriel sur le site officiel, mais j'écrirai d'abord la procédure d'installation.

Installez Rabbit MQ

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

Installez la bibliothèque Python 'pika'

Vous pouvez l'installer avec pip.

sudo pip install pika

Lorsque vous êtes prêt, passons au didacticiel.

Tutorial 1: Hello World

introduction

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. producer.png

--_ 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. queue.png

--_ 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". consumer.png

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: python-one-overall.png

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.

Envoyer

sending.png 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.

Recevoir

receiving.png 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()

Code entier

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

Tutoriel Rabbit MQ (1) - De l'installation à Hello World (traduction du site officiel)
Tutoriel Flask (de l'installation à Hello World)
Tutoriel RabbitMQ 1 ("Hello World!")
Configuration de RaspberryPi3 (STRETCH) depuis l'installation du système d'exploitation vers Hello World
De la création de l'environnement Kivy à l'affichage de Hello World
De la configuration de l'environnement Rust à l'exécution de Hello World
De la création d'un environnement Python pour les personnes inexpérimentées à Hello world
De l'installation d'Elasticsearch à la saisie des données
Introduction à TensorFlow - Hello World Edition
Installation d'OpenMPI Du téléchargement au passage
Essayez le tutoriel officiel de Django depuis le début
Introduction à Ansible Partie 1 Hello World !! '
Langage C pour voir et se souvenir de la partie 1 Appeler le langage C depuis Python (bonjour le monde)
[Python] Application Web à partir de 0! Pratique (2) -Bonjour le monde-
[Note] [PyTorch] De l'installation à la simplicité d'utilisation
Comment créer Hello, World avec #Nix
Comment afficher Hello World en python
Introduction à Scapy ① (De l'installation à l'exécution de Scapy)