2015-11-18 22 views
7


Mam serwer rabbitmq i konsument amqp (python) za pomocą kombu.
Mam zainstalowaną aplikację w systemie, który ma zaporę, która zamyka nieaktywne połączenia po 1 godzinie.
To mój amqp_consumer.py:RabbitMQ heartbeat vs zdarzenia drenowania połączenia timeout

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 

co chcę jest, że jeśli zapora zamknął połączenie, a następnie chcę ponownie. powinienem użyć argumentu pulsu lub powinienem przekazać argument timeout (z 3600 s) do funkcji drain_events()?
Jakie są różnice między obiema opcjami? (wydaje się robić to samo).
Dzięki.

Odpowiedz

0

Wyzwalacze drain_events nie wygenerują żadnych uderzeń serca, chyba że są wiadomości do skonsumowania i potwierdzenia. Jeśli kolejka jest bezczynna, to ostatecznie połączenie zostanie zamknięte (przez serwer królika lub zaporę ogniową).

Co należy zrobić, to używać zarówno bicie serca i czas oczekiwania tak:

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

W ten sposób nawet jeśli kolejka jest bezczynne połączenie nie zostanie zamknięte.

Poza tym możesz chcieć owinąć całość za pomocą zasady ponawiania w przypadku zamknięcia połączenia lub innego błędu sieci.