Utilisez diverses fonctionnalités de rabbimq avec python pika

introduction

Dans le précédent Manipulation de rabbimq avec python, j'ai échangé des messages simples avec RabbitMq, mais comme RabbitMq a diverses fonctions, cette fois c'est différent. Les fonctionnalités et l'utilisation sont résumées.

environnement

Paramètres de confirmation de la file d'attente

Avec les paramètres pika standard, si la file d'attente que vous souhaitez envoyer et recevoir n'existe pas dans Rabbit Mq, elle sera créée automatiquement, mais vous souhaiterez peut-être faire une erreur sans créer la file d'attente automatiquement. Dans ce cas, donner True à l'argument passif de la fonction `` queue_declare () '' du canal entraînera une erreur s'il n'y a pas de file d'attente.

Exemple de situation

Par exemple, lorsque vous souhaitez gérer toutes les files d'attente du côté producteur et autoriser les connexions pures du côté consommateur.

Producteur avec passif défini sur true

Je viens d'ajouter passive = True` au producteur channel.queue_declare () '' créé comme l'exemple précédent. Si la file d'attente existe, vous pouvez vous connecter telle quelle, mais si la file d'attente n'existe pas, pika.exceptions.ChannelClosedByBroker` `` apparaîtra comme une exception.

client_main.py



import pika

pika_param = pika.ConnectionParameters('localhost')
connection = pika.BlockingConnection(pika_param)
channel = connection.channel()

try:
    channel.queue_declare(queue='hello', passive=True)
except pika.exceptions.ChannelClosedByBroker as ex:
    print(ex)
    exit(1)

channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')

connection.close()

Effectuer la vérification de la file d'attente

Maintenant que nous avons la source, exécutons-la. Une exception s'est produite. Si vous regardez l'exception qui s'est produite, vous pouvez voir qu'il n'y a pas de file d'attente Hello.


PS C:\Users\xxxx\program\python\pika> python .\client_main.py
(404, "NOT_FOUND - no queue 'hello' in vhost '/'")

Paramètres de connexion exclusifs

Le paramètre pika standard accepte les connexions sans condition, mais vous pouvez appliquer un contrôle exclusif afin que les autres connexions ne soient pas acceptées. Dans ce cas, si True est donné à l'argument exclusif de la fonction queue_declare () '' '' du canal, une erreur se produira lorsqu'une autre connexion est connectée, elle peut donc être utilisée pour vérifier l'exclusion. Si vous fermez la connexion, vous pouvez connecter une autre connexion.

Exemple de situation

Par exemple, lorsque vous ne souhaitez pas accepter les messages d'autres consommateurs tant que vous n'avez pas préparé le message côté consommateur et l'avez envoyé à RabbitMq.

Producteur avec des paramètres de connexion exclusifs activés

channel.queue_declare()Exclusif à=J'ajoute juste True. Cette fois, après m'être connecté une fois, je fais une nouvelle connexion et je me connecte sans fermer la connexion. Pour les connexions qui viennent plus tard, pika.exceptions.ChannelClosedByBroker est une exception.





#### **` client_main.py`**
```py


import pika

pika_param = pika.ConnectionParameters('localhost')
connection = pika.BlockingConnection(pika_param)
channel = connection.channel()
channel.queue_declare(queue='hello', exclusive=True)
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
channel.close()

connection = pika.BlockingConnection(pika_param)
channel = connection.channel()
try:
    channel.queue_declare(queue='hello')
except pika.exceptions.ChannelClosedByBroker as ex:
    print('other connection access fail')
    exit(1)
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
channel.close()

channel.close()Sous connexion.close()Si vous entrez, cela se terminera normalement.



## Exécution d'une connexion exclusive
 Maintenant que nous avons la source, exécutons-la. Une exception s'est produite lors de la deuxième connexion de la file d'attente. Si vous affichez l'exception qui s'est produite, vous pouvez voir que hello a un verrou d'accès.

PS C:\Users\xxxx\program\python\pika> python .\client_main.py other connection access fail (405, "RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'hello' in vhost '/'. It could be originally declared on another connection or the exclusive property value does not match that of the original declaration.")



# Réglage de la limite de canal
 Les paramètres pika standard vous permettent de créer des canaux sans condition, mais vous pouvez définir la limite supérieure du canal. Dans ce cas, vous pouvez définir la limite supérieure en donnant une limite supérieure à l'argument channel_max de la fonction `` `` pika.ConnectionParameters () '' de pika. Une erreur se produit si vous essayez de créer un canal qui dépasse la limite.

## Exemple de situation
 Étant donné que le serveur de RabbitMq n'est pas abondant, lors du réglage du nombre de canaux générés, etc.

## Producteur avec limites de canal activées

#### **` pika.ConnectionParameters()Canal_max=J'ajoute juste 2. Cette fois, la limite supérieure est fixée à 2, donc 3 canaux sont créés sans signification. En conséquence, pika n'a pas pu être créé pour la troisième chaîne.exceptions.ConnectionClosedByBroker apparaît comme une exception.`**

client_main.py



import pika

pika_param = pika.ConnectionParameters('localhost', channel_max=2)
connection = pika.BlockingConnection(pika_param)

channel = connection.channel(1)
channel = connection.channel(2)
try:
    channel = connection.channel(3)
except pika.exceptions.ConnectionClosedByBroker as ex:
    print('channel crate error')
    print(ex)

Exécution du plafond de canal

Maintenant que nous avons la source, exécutons-la. Une exception s'est produite lors de la création du troisième canal. Si vous affichez l'exception qui s'est produite, vous pouvez voir que la limite de canal est de 2.


PS C:\Users\xxxx\program\python\pika> python .\client_main.py
channel crate error
(530, 'NOT_ALLOWED - number of channels opened (2) has reached the negotiated channel_max (2)')

Réessayer les paramètres

Vous pouvez définir le nombre de tentatives en cas d'échec de la connexion pika. Dans ce cas, vous pouvez définir le nombre en donnant le nombre de tentatives à l'argument connection_attempts de la fonction pika.ConnectionParameters () '' de pika.

Exemple de situation

Lorsque le réseau vers le serveur de Rabbit Mq est instable, etc.

Producteur avec les paramètres de nouvelle tentative activés

pika.ConnectionParameters()Se connecter à_attempts=J'ajoute juste 2. Cette fois, RabbitMq est abandonné en produisant un journal de pika afin que vous puissiez voir qu'il réessaye. Top logger.Le système xxx est un paramètre pour la sortie du journal dans pika.





#### **` client_main.py`**
```py


import pika
import datetime
import logging 

logger = logging.getLogger('pika')
logger.setLevel(logging.ERROR)
logger.addHandler(logging.StreamHandler())
pika_param = pika.ConnectionParameters('localhost', connection_attempts=2)

try:
    print('start connect {}'.format(datetime.datetime.now()))
    connection = pika.BlockingConnection(pika_param)
except pika.exceptions.AMQPConnectionError as ex:
    print('connect error {}'.format(datetime.datetime.now()))
    print(ex)

Exécuter une nouvelle tentative

Maintenant que nous avons la source, exécutons-la. C'est difficile à comprendre car il y a beaucoup de journaux, mais des erreurs similaires se sont produites 4 fois (2 fois l'erreur x la valeur de consigne réessayer (2 fois)).


PS C:\Users\xxxx\program\python\pika> python .\client_main.py
start connect 2020-03-01 21:46:18.549268
Socket failed to connect: <socket.socket fd=936, family=AddressFamily.AF_INET6, type=SocketKind.SOCK_STREAM, proto=6, laddr=('::', 38520, 0, 0)>; error=10061 (Unknown error)
TCP Connection attempt failed: ConnectionRefusedError(10061, 'Unknown error'); dest=(<AddressFamily.AF_INET6: 23>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('::1', 5672, 0, 0))
AMQPConnector - reporting failure: AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error')
Socket failed to connect: <socket.socket fd=936, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6, laddr=('0.0.0.0', 38524)>; error=10061 (Unknown error)
TCP Connection attempt failed: ConnectionRefusedError(10061, 'Unknown error'); dest=(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('127.0.0.1', 5672))
AMQPConnector - reporting failure: AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error')
Socket failed to connect: <socket.socket fd=812, family=AddressFamily.AF_INET6, type=SocketKind.SOCK_STREAM, proto=6, laddr=('::', 38533, 0, 0)>; error=10061 (Unknown error)
TCP Connection attempt failed: ConnectionRefusedError(10061, 'Unknown error'); dest=(<AddressFamily.AF_INET6: 23>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('::1', 5672, 0, 0))
AMQPConnector - reporting failure: AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error')
Socket failed to connect: <socket.socket fd=812, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6, laddr=('0.0.0.0', 38535)>; error=10061 (Unknown error)
TCP Connection attempt failed: ConnectionRefusedError(10061, 'Unknown error'); dest=(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('127.0.0.1', 5672))
AMQPConnector - reporting failure: AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error')
AMQP connection workflow failed: AMQPConnectionWorkflowFailed: 4 exceptions in all; last exception - AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error'); first exception - AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error').
AMQPConnectionWorkflow - reporting failure: AMQPConnectionWorkflowFailed: 4 exceptions in all; last exception - AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error'); first exception - AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error')
Connection workflow failed: AMQPConnectionWorkflowFailed: 4 exceptions in all; last exception - AMQPConnectorSocketConnectError: 
ConnectionRefusedError(10061, 'Unknown error'); first exception - AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 
'Unknown error')
Error in _create_connection().
Traceback (most recent call last):
  File "C:\Users\minkl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pika\adapters\blocking_connection.py", line 450, in _create_connection
    raise self._reap_last_connection_workflow_error(error)
pika.exceptions.AMQPConnectionError
connect error 2020-03-01 21:46:28.665843

en conclusion

J'ai essayé d'utiliser les fonctions de Rabbit Mq qui semblent être souvent utilisées. Je pense qu'il a toutes les fonctionnalités dont j'ai besoin, mais je me sentais confus si je ne comprenais pas et n'utilisais pas quels paramètres étaient des files d'attente, des connexions ou des canaux.

Recommended Posts

Utilisez diverses fonctionnalités de rabbimq avec python pika
Utiliser rospy avec virtualenv dans Python3
Utiliser Python mis en pyenv avec NeoVim
Utiliser OpenCV avec Python 3 dans Window
Utilisez config.ini avec Python
[Python] Utiliser JSON avec Python
Utiliser des dates en Python
Utiliser Valgrind avec Python
Utiliser mecab avec Python 3
Utiliser DynamoDB avec Python
Utilisez Python 3.8 avec Anaconda
Manipuler rabbimq avec python
Utiliser python avec docker
Comment utiliser tkinter avec python dans pyenv
Utiliser Python dans un environnement Anaconda avec VS Code
Utiliser le profileur en Python
Utiliser l'API Trello avec python
Utiliser l'expression let en Python
Grattage au sélénium en Python
Utiliser le protocole de mesure avec Python
Exploitez LibreOffice avec Python
Grattage avec chromedriver en python
Utiliser la fonction de rappel en Python
Utiliser l'API Twitter avec Python
Utiliser le magasin de paramètres en Python
Débogage avec pdb en Python
Utiliser le cache HTTP en Python
Utiliser TUN / TAP avec Python
Utilisez l'ODM de MongoDB avec Python
Gérer les sons en Python
Utiliser un dict clé de liste en Python
Grattage avec du sélénium en Python
Utiliser Random Forest avec Python
Grattage avec Tor en Python
Utilisez Spyder de Python IDE
Tweet avec image en Python
Manipulez diverses bases de données avec Python
Combiné avec ordinal en Python
Utiliser l'API subsonique avec python3
Reconnaissance des nombres dans les images avec Python
Utiliser la caméra Point Grey avec Python (PyCapture2)
Tester avec des nombres aléatoires en Python
Utilisez vl53l0x avec RaspberryPi (python)
GOTO en Python avec Sublime Text 3
Travailler avec LibreOffice en Python: import
Utilisez le tissu tel quel en python (fabric3)
Analyse CSS avec cssutils en Python
Comment utiliser SQLite en Python
Numer0n avec des objets fabriqués avec Python
Utilisez NAIF SPICE TOOL KIT avec Python
Ouvrez UTF-8 avec BOM en Python
Comment utiliser Mysql avec python
Comment utiliser ChemSpider en Python
Utiliser la synthèse vocale Windows 10 avec Python
Heatmap avec dendrogramme en Python + matplotlib
Comment utiliser PubChem avec Python
Lire des fichiers en parallèle avec Python
Générer un mot de passe pour le manuel avec python