Domanda

Ho alcuni script, che usano pika.SelectConnection per comunicare con il server RabbitMq.

Esiste comunque la possibilità di far sì che quegli script provino a riconnettersi automaticamente al server rmq, nel caso in cui il server si arresti, mentre lo script funziona?

È stato utile?

Soluzione

Ho molti script che utilizzano il seguente approccio per la riconnessione:

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

Non sta usando pika, ma Kombu, tuttavia i principi possono essere applicati.Il metodo drain_events è il fulcro del consumo di messaggi, ovvero esegue continuamente la ricezione dei messaggi ed esegue un callback per elaborare il messaggio.Come puoi vedere qui ho il timeout della libreria di socket di basso livello ogni 25 secondi.Con alcune librerie ho dovuto patchare un paio di righe di codice per far funzionare questo comportamento senza crash all'interno del modulo.

In ogni caso, l'heartbeat inviato da hb.beat è monitorato da un processo supervisore e questo processo ucciderà lo script se ci sono troppi errori in un arco di tempo troppo breve.Dopo aver ucciso lo script, il supervisore lo riavvia.Ciò ha funzionato bene nella gestione di errori di rete intermittenti o riavvii del broker MQ.Anche se avrei potuto fare in modo che il mio script eseguisse la riconnessione, è stato più semplice terminare e riavviare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top