Frage

Ich habe einige Skripte, die pika.SelectConnection verwenden, um mit dem RabbitMq-Server zu kommunizieren.

Gibt es überhaupt eine Möglichkeit, diese Skripte dazu zu bringen, automatisch eine Verbindung zum rmq-Server wiederherzustellen, falls der Server ausfällt, während das Skript funktioniert?

War es hilfreich?

Lösung

Ich habe viele Skripte, die den folgenden Ansatz zum erneuten Verbinden verwenden:

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

Es wird kein Pika verwendet, sondern Kombu, dennoch können die Prinzipien angewendet werden.Das drain_events-Verfahren ist der Kern des Nachrichtenverbrauchs, d. H. Es schleift für immer Schleifen, die Nachrichten empfangen und einen Rückruf ausführen, um die Nachricht zu verarbeiten.Wie Sie hier sehen können, läuft die Low-Level-Socket-Bibliothek alle 25 Sekunden ab.Bei einigen Bibliotheken musste ich einige Codezeilen patchen, damit dieses Verhalten funktioniert, ohne dass es im Modul abstürzt.

In jedem Fall wird der von hb.beat gesendete Heartbeat von einem Supervisor-Prozess überwacht, und dieser Prozess beendet das Skript, wenn in zu kurzer Zeit zu viele Fehler auftreten.Nach dem Beenden des Skripts startet der Supervisor es neu.Dies hat sich bei zeitweiligen Netzwerkfehlern oder Neustarts des MQ-Brokers bewährt.Ich hätte mein Skript dazu bringen können, die Verbindung wiederherzustellen, aber es war einfacher zu beenden und neu zu starten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top