Question

J'ai des scripts, en utilisant PIKA.SelectConnection pour communiquer avec le serveur RabbitMQ.

Y a-t-il de toute façon de faire en sorte que ces scripts essaient automatiquement le serveur RMQ, au cas où le serveur baissait, pendant que le script fonctionne?

Était-ce utile?

La solution

J'ai beaucoup de scripts qui utilisent l'approche suivante pour reconnecter:

 while True:
     try:
         mqExch.channel.connection.drain_events(timeout=25)
     except socket.timeout:
         hb.beat() # let our supervisor know we are not hung

Il n'utilise pas Pika, mais Kombu, néanmoins, les principes peuvent être appliqués. La drain_events La méthode est au cœur de la consommation de messages, c'est-à-dire qu'il boucle pour toujours recevoir des messages et exécuter un rappel pour traiter le message. Comme vous pouvez le voir ici, j'ai la bibliothèque de socket de bas niveau de synchronisation toutes les 25 secondes. Avec certaines bibliothèques, j'ai dû corriger quelques lignes de code pour faire fonctionner ce comportement sans s'écraser à l'intérieur du module.

Dans tous les cas, le rythme cardiaque envoyé par HB.Beat est surveillé par un processus de superviseur et ce processus tuera le script s'il y a trop d'échecs dans une période trop courte. Après avoir tué le script, le superviseur le redémarre. Cela a bien fonctionné dans le traitement des erreurs de réseau intermittent ou des redémarrages MQ Broker. Bien que j'aurais pu faire en sorte que mon script fasse la reconnexion, il était plus simple de tuer et de redémarrer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top