2015-11-18 13 views
7


Ho un server rabbitmq e un utente amqp (python) che utilizza kombu.
Ho installato la mia app in un sistema con un firewall che chiude le connessioni inattive dopo 1 ora.
Questo è il mio amqp_consumer.py:RabbitMQ heartbeat vs timeout connessione drain time

try: 
    # connections 
    with Connection(self.broker_url, ssl=_ssl, heartbeat=self.heartbeat) as conn: 
     chan = conn.channel() 
     # more stuff here 
     with conn.Consumer(queue, callbacks = [messageHandler], channel = chan): 
     # Process messages and handle events on all channels 
     while True: 
      conn.drain_events() 

except Exception as e: 
    # do stuff 

quello che voglio è che se il firewall ha chiuso la connessione, quindi voglio ricollegare. dovrei usare l'argomento heartbeat o dovrei passare un argomento timeout (di 3600 sec) alla funzione drain_events()?
Quali sono le differenze tra le due opzioni? (sembra fare lo stesso).
Grazie.

risposta

0

Gli drain_events di per sé non producono alcun heartbeat, a meno che non ci siano messaggi da consumare e riconoscere. Se la coda è inattiva, alla fine la connessione verrà chiusa (dal server dei conigli o dal firewall).

Che cosa si dovrebbe fare è utilizzare sia il battito cardiaco e il timeout in questo modo:

while True: 
    try: 
     conn.drain_events(timeout=1) 
    except socket.timeout: 
     conn.heartbeat_check() 

In questo modo, anche se la coda è inattivo il collegamento non verrà chiusa.

Oltre a ciò, è possibile che si desideri racchiudere il tutto con un criterio di riprova nel caso in cui la connessione venga chiusa o qualche altro errore di rete.